endif()
set(MINIMAL_FMTS
- magproto.cc explorist_ini.cc gpx.cc geo.cc mapsend.cc garmin.cc
+ magproto.cc explorist_ini.cc gpx.cc geo.cc garmin.cc
garmin_device_xml.cc garmin_tables.cc internal_styles.cc nmea.cc
kml.cc wbt-200.cc
)
set(ALL_FMTS
- ${MINIMAL_FMTS} gtm.cc gpsutil.cc pcx.cc
+ ${MINIMAL_FMTS} gtm.cc
skytraq.cc holux.cc tpg.cc tpo.cc
- xcsv.cc tiger.cc easygps.cc
+ xcsv.cc easygps.cc
saroute.cc navicache.cc delgpl.cc
ozi.cc text.cc html.cc
igc.cc brauniger_iq.cc shape.cc hiketech.cc glogbook.cc
vcf.cc lowranceusr.cc tomtom.cc
- tef_xml.cc maggeo.cc vitosmt.cc gdb.cc bcr.cc
- ignrando.cc stmwpp.cc nmn4.cc compegps.cc
- yahoo.cc unicsv.cc wfff_xml.cc garmin_txt.cc gpssim.cc
- stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc vitovtt.cc
- ggv_log.cc g7towin.cc garmin_gpi.cc lmx.cc random.cc xol.cc dg-100.cc
- navilink.cc mtk_logger.cc ik3d.cc osm.cc destinator.cc exif.cc vidaone.cc
- igo8.cc gopal.cc humminbird.cc mapasia.cc gnav_trl.cc navitel.cc ggv_ovl.cc
- jtr.cc sbp.cc sbn.cc mmo.cc skyforce.cc itracku.cc v900.cc
- pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc enigma.cc
- vpl.cc teletype.cc jogmap.cc wintec_tes.cc
+ tef_xml.cc gdb.cc bcr.cc
+ ignrando.cc
+ unicsv.cc garmin_txt.cc gpssim.cc
+ gtrnctr.cc dmtlog.cc raymarine.cc
+ ggv_log.cc garmin_gpi.cc lmx.cc random.cc xol.cc dg-100.cc
+ navilink.cc mtk_logger.cc ik3d.cc osm.cc destinator.cc exif.cc
+ igo8.cc humminbird.cc mapasia.cc gnav_trl.cc navitel.cc ggv_ovl.cc
+ sbp.cc sbn.cc mmo.cc itracku.cc v900.cc
+ enigma.cc
+ teletype.cc wintec_tes.cc
subrip.cc garmin_xt.cc garmin_fit.cc
mtk_locus.cc googledir.cc mapbar_track.cc mapfactor.cc f90g_track.cc
energympro.cc mynav.cc ggv_bin.cc globalsat_sport.cc geojson.cc qstarz_bl_1000.cc
)
-#DEPRECATED_FMTS=cetus.cc copilot.cc gpspilot.cc magnav.cc psp.cc gcdb.cc quovadis.cc gpilots.cc geoniche.cc palmdoc.cc hsa_ndv.cc coastexp.cc pathaway.cc coto.cc msroute.cc mag_pdb.cc axim_gpb.cc delbin.cc google.cc psitrex.cc
-
-#DEPRECATED_HEADERS=geo.h quovadis.h
-#DEPRECATED_SHAPE=pdbfile.cc
-
# ALL_FMTS=$$MINIMAL_FMTS
set(FILTERS
position.cc radius.cc duplicate.cc arcdist.cc polygon.cc smplrout.cc
legacyformat.h
lowranceusr.h
magellan.h
- mapsend.h
mynav.h
navilink.h
nmea.h
vecs.h
xcsv.h
xmlgeneric.h
- yahoo.h
+
zlib/crc32.h
zlib/deflate.h
zlib/gzguts.h
GB.setupfile.output = gui/setup.iss
QMAKE_SUBSTITUTES += GB.setupfile
-MINIMAL_FMTS = magproto.cc explorist_ini.cc gpx.cc geo.cc mapsend.cc garmin.cc \
+MINIMAL_FMTS = magproto.cc explorist_ini.cc gpx.cc geo.cc garmin.cc \
garmin_device_xml.cc garmin_tables.cc nmea.cc \
kml.cc wbt-200.cc
-ALL_FMTS=$$MINIMAL_FMTS gtm.cc gpsutil.cc pcx.cc \
+ALL_FMTS=$$MINIMAL_FMTS gtm.cc \
skytraq.cc holux.cc tpg.cc tpo.cc \
- xcsv.cc tiger.cc easygps.cc \
+ xcsv.cc easygps.cc \
saroute.cc navicache.cc delgpl.cc \
ozi.cc text.cc html.cc \
igc.cc brauniger_iq.cc shape.cc hiketech.cc glogbook.cc \
vcf.cc lowranceusr.cc tomtom.cc \
- tef_xml.cc maggeo.cc vitosmt.cc gdb.cc bcr.cc \
- ignrando.cc stmwpp.cc nmn4.cc compegps.cc \
- yahoo.cc unicsv.cc wfff_xml.cc garmin_txt.cc gpssim.cc \
- stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc vitovtt.cc \
- ggv_log.cc g7towin.cc garmin_gpi.cc lmx.cc random.cc xol.cc dg-100.cc \
- navilink.cc mtk_logger.cc ik3d.cc osm.cc destinator.cc exif.cc vidaone.cc \
- igo8.cc gopal.cc humminbird.cc mapasia.cc gnav_trl.cc navitel.cc ggv_ovl.cc \
- jtr.cc sbp.cc sbn.cc mmo.cc skyforce.cc itracku.cc v900.cc \
- pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc enigma.cc \
- vpl.cc teletype.cc jogmap.cc wintec_tes.cc \
+ tef_xml.cc gdb.cc bcr.cc \
+ ignrando.cc \
+ unicsv.cc garmin_txt.cc gpssim.cc \
+ gtrnctr.cc dmtlog.cc raymarine.cc \
+ ggv_log.cc garmin_gpi.cc lmx.cc random.cc xol.cc dg-100.cc \
+ navilink.cc mtk_logger.cc ik3d.cc osm.cc destinator.cc exif.cc \
+ igo8.cc humminbird.cc mapasia.cc gnav_trl.cc navitel.cc ggv_ovl.cc \
+ sbp.cc sbn.cc mmo.cc itracku.cc v900.cc \
+ enigma.cc \
+ teletype.cc wintec_tes.cc \
subrip.cc garmin_xt.cc garmin_fit.cc \
mtk_locus.cc googledir.cc mapbar_track.cc mapfactor.cc f90g_track.cc \
energympro.cc mynav.cc ggv_bin.cc globalsat_sport.cc geojson.cc qstarz_bl_1000.cc
-DEPRECATED_FMTS=cetus.cc copilot.cc gpspilot.cc magnav.cc psp.cc gcdb.cc quovadis.cc gpilots.cc geoniche.cc palmdoc.cc hsa_ndv.cc coastexp.cc pathaway.cc coto.cc msroute.cc mag_pdb.cc axim_gpb.cc delbin.cc google.cc psitrex.cc
-
-DEPRECATED_HEADERS=geo.h quovadis.h
-DEPRECATED_SHAPE=pdbfile.cc
-
# ALL_FMTS=$$MINIMAL_FMTS
FILTERS=position.cc radius.cc duplicate.cc arcdist.cc polygon.cc smplrout.cc \
reverse_route.cc sort.cc stackfilter.cc trackfilter.cc discard.cc \
legacyformat.h \
lowranceusr.h \
magellan.h \
- mapsend.h \
mynav.h \
navilink.h \
nmea.h \
vecs.h \
xcsv.h \
xmlgeneric.h \
- yahoo.h \
src/core/datetime.h \
src/core/file.h \
src/core/logging.h \
+++ /dev/null
-/*
-
- Support for CompeGPS waypoint (.wpt), route (.rte) and track (.trk) files,
-
- Copyright (C) 2005 Olaf Klein, o.b.klein@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-/*
- History:
- 10/23/2005: First release; only a reader
- 10/25/2005: becomes a writer too
- 10/26/2005: received documentation from CompeGPS team
- added fatals for "G" and "U" if not WGS84 and lat/lon
- 08/13/2006: switch to gbfile api
-*/
-
-/*
-
- the meaning of leading characters in CompeGPS data lines (enhanced PCX):
-
- header lines:
-
- "G": WGS 84 - Datum of the map
- "N": Anybody - Name of the user
- "L": -02:00:00 - Difference to UTC
- "M": ... - Any comments
- "R": 16711680 , xxxx , 1 - Route header
- "U": 1 - System of coordinates (0=UTM 1=Latitude/Longitude)
-
- "C": 0 0 255 2 -1.000000 - ???
- "V": 0.0 0.0 0 0 0 0 0.0 - ???
- "E": 0|1|00-NUL-00 00:00:00|00:00:00|0 - ???
-
- data lines:
-
- "W": if(route) routepoint; else waypoint
- "T": trackpoint
- "t": if(track) additionally track info
- if(!track) additionally trackpoint info
- "a": link to ...
- "w": waypoint additional info
-
-*/
-
-#include "defs.h"
-#include "cet_util.h"
-#include "csv_util.h"
-
-#if CSVFMTS_ENABLED
-#include <cmath>
-#include "jeeps/gpsmath.h"
-#include <cstdlib>
-#include <cstdio>
-
-#define MYNAME "CompeGPS"
-
-#define SHORT_NAME_LENGTH 16
-
-static gbfile* fin, *fout;
-static int target_index, curr_index;
-static int track_info_flag;
-static short_handle sh;
-static int snlen;
-static int radius;
-static int input_datum;
-
-static const route_head* curr_track;
-
-/* placeholders for options */
-
-static char* option_icon;
-static char* option_index;
-static char* option_radius;
-static char* option_snlen;
-
-static
-QVector<arglist_t> compegps_args = {
- {
- "deficon", &option_icon, "Default icon name",
- nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "index", &option_index, "Index of route/track to write (if more than one in source)",
- nullptr, ARGTYPE_INT, "1", nullptr, nullptr
- },
- {
- "radius", &option_radius, "Give points (waypoints/route points) a default radius (proximity)",
- nullptr, ARGTYPE_FLOAT, "0", nullptr, nullptr
- },
- {
- "snlen", &option_snlen, "Length of generated shortnames (default 16)",
- "16", ARGTYPE_INT, "1", nullptr, nullptr
- },
-};
-
-static
-void fix_datum(double* lat, double* lon)
-{
- double amt;
-
- /*
- * Avoid FP jitter in the common case.
- */
- if (input_datum != DATUM_WGS84) {
- GPS_Math_Known_Datum_To_WGS84_M(*lat, *lon, 0.0, lat, lon,
- &amt, input_datum);
- }
-}
-
-static void
-compegps_parse_date(const char* c, QDate& date)
-{
- date = QDate::fromString(c, "dd-MMM-yy");
- // If that worked, fix 1900 bias to 2000 bias. Some have full 4 digits.
- if (date.isValid()) {
- date = date.addYears(100);
- } else {
- date = QDate::fromString(c, "dd-MMM-yyyy");
- }
-}
-
-static void
-compegps_parse_time(const char* c, QTime& time)
-{
- time = QTime::fromString(c, "hh:mm:ss");
-}
-
-/* specialized readers */
-
-static Waypoint*
-parse_wpt(char* buff)
-{
- int col = -1;
- char* cx;
- auto* wpt = new Waypoint;
- int has_time = 0;
- QDate date;
- QTime time;
-
- char* c = strstr(buff, "A ");
- if (c == buff) {
- col++;
- }
-
- c = csv_lineparse(buff, " ", "", col++);
- while (c != nullptr) {
- c = lrtrim(c);
- if (*c != '\0') {
-#if 0
- printf(MYNAME "_read_wpt: col(%d)=%s\n", col, c);
-#endif
- switch (col) {
- case 0:
-
- cx = c + strlen(c) - 1; /* trim trailing underscores */
- while ((cx >= c) && (*cx == '_')) {
- *cx-- = '\0';
- }
- if (*c != '\0') {
- wpt->shortname = c;
- }
- break;
- case 2:
- human_to_dec(c, &wpt->latitude, nullptr, 1);
- break;
- case 3:
- human_to_dec(c, nullptr, &wpt->longitude, 2);
- break;
- // Older compegps used a dumb constant.
- // Report are that 2010-era writes a sensible
- // value here.
- /* always "27-MAR-62 00:00:00" */
- case 4:
- if (strcmp(c, "27-MAR-62")) {
- has_time = 1;
- compegps_parse_date(c, date);
- }
- break;
- case 5:
- if (has_time) {
- compegps_parse_time(c, time);
- wpt->SetCreationTime(QDateTime(date, time, Qt::UTC));
- }
- break;
- case 6:
- wpt->altitude = atof(c);
- break;
- case 7:
- wpt->description = c;
- break;
- default:
- if (col > 7) {
- wpt->description += " ";
- wpt->description += c;
- }
- }
- }
- c = csv_lineparse(nullptr, " ", "", col++);
- }
- fix_datum(&wpt->latitude, &wpt->longitude);
- return wpt;
-}
-
-static void
-parse_wpt_info(const char* buff, Waypoint* wpt) /* "w" */
-{
- int col = -1;
- double fx;
-
- char* c = csv_lineparse(buff, ",", "", col++);
- while (c != nullptr) {
- c = lrtrim(c);
- if (*c != '\0') {
-#if 0
- printf(MYNAME "_read_wpt_info: col(%d)=%s\n", col, c);
-#endif
- switch (col) {
- case 0:
- wpt->icon_descr = c;
- break;
- case 1:
- break; /* Text postion */
- case 2:
- break; /* Lens zoom level */
- case 3:
- break; /* Text colour */
- case 4:
- break; /* Background colour */
- case 5:
- break; /* Transparent text (0=transparent, 1=no transparent) */
- case 6:
- break; /* ??? */
- case 7:
- break; /* ??? */
- case 8: /* radius */
- fx = atof(c);
- if (fx > 0) {
- WAYPT_SET(wpt, proximity, fx);
- }
- break;
- }
- }
- c = csv_lineparse(nullptr, ",", "", col++);
- }
-}
-
-static Waypoint*
-parse_trkpt(char* buff)
-{
- int col = -1;
- auto* wpt = new Waypoint;
- QDate date;
- QTime time;
-
- char* c = strstr(buff, "A ");
- if (c == buff) {
- col++;
- }
-
- c = csv_lineparse(buff, " ", "", col++);
- while (c != nullptr) {
- c = lrtrim(c);
- if (*c != '\0') {
-#if 0
- printf(MYNAME "_read_trkpt: col(%d)=%s\n", col, c);
-#endif
- switch (col) {
- case 2:
- human_to_dec(c, &wpt->latitude, nullptr, 1);
- break;
- case 3:
- human_to_dec(c, nullptr, &wpt->longitude, 2);
- break;
- case 4:
- compegps_parse_date(c, date);
- break;
- case 5:
- compegps_parse_time(c, time);
- wpt->SetCreationTime(QDateTime(date, time, Qt::UTC));
- break;
- case 7:
- wpt->altitude = atof(c);
- break;
- }
- }
- c = csv_lineparse(nullptr, " ", "", col++);
- }
- fix_datum(&wpt->latitude, &wpt->longitude);
- return wpt;
-}
-
-static void
-parse_track_info(const char* buff, route_head* track) /* "t" */
-{
- int col = -1;
-
- char* c = csv_lineparse(buff, "|", "", col++);
- while (c != nullptr) {
- c = lrtrim(c);
- if (*c != '\0') {
-#if 0
- printf(MYNAME "_read_track_info: col(%d)=%s\n", col, c);
-#endif
- switch (col) {
- case 0:
- break; /* unknown field */
- case 1:
- track->rte_name = c;
- break;
- case 2:
- break; /* unknown field */
- case 3:
- break; /* unknown field */
- }
- }
- c = csv_lineparse(nullptr, "|", "", col++);
- }
-}
-
-static void
-parse_rte_info(const char* buff, route_head* route) /* "R" */
-{
- int col = -1;
-
- char* c = csv_lineparse(buff, ",", "", col++);
- while (c != nullptr) {
- c = lrtrim(c);
- if (*c != '\0') {
-#if 0
- printf(MYNAME "_read_rte_info: col(%d)=%s\n", col, c);
-#endif
- switch (col) {
- case 0:
- break; /* unknown field (colour?) */
- case 1:
- route->rte_name = c;
- break;
- case 2:
- break; /* unknown field */
-
- }
- }
- c = csv_lineparse(nullptr, ",", "", col++);
- }
-}
-
-/* main functions */
-
-static void
-compegps_rd_init(const QString& fname)
-{
- fin = gbfopen(fname, "rb", MYNAME);
- input_datum = DATUM_WGS84;
-}
-
-static void
-compegps_rd_deinit()
-{
- gbfclose(fin);
-}
-
-static void
-compegps_data_read()
-{
- char* buff;
- int line = 0;
- Waypoint* wpt = nullptr;
- route_head* route = nullptr;
- route_head* track = nullptr;
-
- while ((buff = gbfgetstr(fin))) {
- if ((line++ == 0) && fin->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
- char* cin = lrtrim(buff);
- if (strlen(cin) == 0) {
- continue;
- }
-
- char* ctail = strchr(cin, ' ');
- if (ctail == nullptr) {
- continue;
- }
- ctail = lrtrim(ctail);
-
- switch (*cin) {
- case 'G':
- input_datum = GPS_Lookup_Datum_Index(ctail);
- if (input_datum < 0) {
- fatal(MYNAME ": Unsupported datum \"%s\"!", ctail);
- }
- break;
- case 'U':
- switch (*ctail) {
- case '1': /* lat/lon, that's we want to see */
- break;
- case '0': /* UTM not supported yet */
- fatal(MYNAME "Sorry, UTM is not supported yet!\n");
- default:
- fatal(MYNAME "Invalid system of coordinates (%s)!\n", cin);
- }
- break;
- case 'R':
- route = new route_head;
- route_add_head(route);
- parse_rte_info(ctail, route);
- break;
- case 'M':
- break;
- case 'W':
- wpt = parse_wpt(ctail);
- if (wpt != nullptr) {
- if (route != nullptr) {
- route_add_wpt(route, wpt);
- } else {
- waypt_add(wpt);
- }
- }
- break;
- case 'w':
- is_fatal((wpt == nullptr), MYNAME ": No waypoint data before \"%s\"!", cin);
- parse_wpt_info(ctail, wpt);
- break;
- case 'T':
- wpt = parse_trkpt(ctail);
- if (wpt != nullptr) {
- if (track == nullptr) {
- track = new route_head;
- track_add_head(track);
- }
- track_add_wpt(track, wpt);
- }
- break;
- case 't':
- if (track != nullptr) {
- parse_track_info(ctail, track);
- }
- break;
- }
- }
-}
-
-/* ----------------------------------------------------------- */
-
-static void
-write_waypt_cb(const Waypoint* wpt)
-{
- if (curr_index != target_index) {
- return;
- }
-
- // Our only output cleansing is to replace
- QString cleaned_name(wpt->shortname);
- cleaned_name.replace(' ', '_');
-
- QString name = (snlen > 0) ? mkshort(sh, cleaned_name) : cleaned_name;
-
- gbfprintf(fout, "W %s A ", CSTR(name));
- gbfprintf(fout, "%.10f%c%c ",
- fabs(wpt->latitude), 0xBA, (wpt->latitude >= 0) ? 'N' : 'S');
- gbfprintf(fout, "%.10f%c%c ",
- fabs(wpt->longitude), 0xBA, (wpt->longitude >= 0) ? 'E' : 'W');
- gbfprintf(fout, "27-MAR-62 00:00:00 %.6f",
- (wpt->altitude != unknown_alt) ? wpt->altitude : 0.0);
- if (wpt->description != nullptr) {
- gbfprintf(fout, " %s", CSTRc(wpt->description));
- }
- gbfprintf(fout, "\n");
-
- if ((!wpt->icon_descr.isNull()) || (wpt->wpt_flags.proximity) || \
- (option_icon != nullptr)) {
- gbfprintf(fout, "w %s,0,0.0,16777215,255,1,7,,%.1f\n",
- wpt->icon_descr.isNull() ? "Waypoint" : CSTR(wpt->icon_descr),
- WAYPT_GET(wpt, proximity, 0));
- }
-}
-
-static void
-write_route_hdr_cb(const route_head* rte)
-{
- curr_index++;
- if (curr_index != target_index) {
- return;
- }
-
- QString name = rte->rte_name;
- if (name != nullptr) {
- name = csv_stringclean(name, ",");
- } else {
- name = " ";
- }
- gbfprintf(fout, "R 16711680,%s,1,-1\n", CSTR(name));
-}
-
-static void
-write_route()
-{
- curr_index = 0;
- route_disp_all(write_route_hdr_cb, nullptr, write_waypt_cb);
-}
-
-static void
-write_track_hdr_cb(const route_head* trk)
-{
- track_info_flag = 0;
- curr_track = trk;
-
- curr_index++;
- if (curr_index != target_index) {
- return;
- }
-
- track_info_flag = 1;
-}
-
-static void
-write_trkpt_cb(const Waypoint* wpt)
-{
- if ((curr_index != target_index) || (wpt == nullptr)) {
- return;
- }
-
- QDateTime default_dt(QDate(1970,1,1), QTime(0,0,0), Qt::UTC);
- auto dt = wpt->creation_time.isValid() ? wpt->GetCreationTime() : default_dt;
- QString buff = dt.toString("dd-MMM-yy hh:mm:ss").toUpper();
-
- gbfprintf(fout, "T A %.10f%c%c %.10f%c%c ",
- fabs(wpt->latitude), 0xBA, (wpt->latitude >= 0) ? 'N' : 'S',
- fabs(wpt->longitude), 0xBA, (wpt->longitude >= 0) ? 'E' : 'W');
- gbfprintf(fout, "%s s %.1f %.1f %.1f %.1f %d ",
- CSTR(buff),
- wpt->altitude,
- 0.0,
- 0.0,
- 0.0,
- 0);
- gbfprintf(fout, "%.1f %.1f %.1f %.1f %.1f\n",
- -1000.0,
- -1.0,
- -1.0,
- -1.0,
- -1.0);
- if (track_info_flag != 0) {
- track_info_flag = 0;
- if (curr_track->rte_name != nullptr) {
- QString name = csv_stringclean(curr_track->rte_name, "|");
- gbfprintf(fout, "t 4294967295|%s|-1|-1\n", CSTR(name));
- }
- }
-}
-
-static void
-write_track()
-{
- curr_index = 0;
-
-// gbfprintf(fout, "L +02:00:00\n");
- track_disp_all(write_track_hdr_cb, nullptr, write_trkpt_cb);
- gbfprintf(fout, "F 1234\n");
-}
-
-static void
-write_waypoints()
-{
- waypt_disp_all(write_waypt_cb);
-}
-
-/* --------------------------------------------------------------------------- */
-
-static void
-compegps_wr_init(const QString& fname)
-{
- fout = gbfopen(fname, "w", MYNAME);
- sh = mkshort_new_handle();
-}
-
-static void
-compegps_wr_deinit()
-{
- mkshort_del_handle(&sh);
- gbfclose(fout);
-}
-
-static void
-compegps_data_write()
-{
- /* because of different file extensions we can only write one GPS data type at time */
-
- gbfprintf(fout, "G WGS 84\n");
- gbfprintf(fout, "U 1\n");
-
- /* process options */
-
- target_index = 1;
- if (option_index != nullptr) {
- target_index = atoi(option_index);
- }
-
- snlen = 0;
- if (global_opts.synthesize_shortnames != 0) {
- if (option_snlen != nullptr) {
- snlen = atoi(option_snlen);
- } else {
- snlen = SHORT_NAME_LENGTH;
- }
-
- is_fatal((snlen < 1), MYNAME "Invalid length for generated shortnames!");
-
- setshort_whitespace_ok(sh, 0);
- setshort_length(sh, snlen);
- }
-
- radius = -1;
- if (option_radius != nullptr) {
- radius = atof(option_radius);
- is_fatal((radius <= 0.0), MYNAME "Invalid value for radius!");
- }
-
- if (option_icon != nullptr) {
- if (*option_icon == '\0') {
- option_icon = nullptr;
- } else if (case_ignore_strcmp(option_icon, "deficon") == 0) {
- option_icon = nullptr;
- }
- }
-
- switch (global_opts.objective) {
- case wptdata:
- case unknown_gpsdata:
- curr_index = target_index = 0;
- write_waypoints();
- break;
- case trkdata:
- write_track();
- break;
- case rtedata:
- write_route();
- break;
- case posndata:
- fatal(MYNAME ": Realtime positioning not supported.\n");
- break;
- }
-}
-
-/* --------------------------------------------------------------------------- */
-
-ff_vecs_t compegps_vecs = {
- ff_type_file,
- FF_CAP_RW_ALL,
- compegps_rd_init,
- compegps_wr_init,
- compegps_rd_deinit,
- compegps_wr_deinit,
- compegps_data_read,
- compegps_data_write,
- nullptr,
- &compegps_args,
- CET_CHARSET_MS_ANSI, 1
- , NULL_POS_OPS,
- nullptr
-};
-#endif /* CSVFMTS_ENABLED */
--- /dev/null
+/*
+
+ Support for CompeGPS waypoint (.wpt), route (.rte) and track (.trk) files,
+
+ Copyright (C) 2005 Olaf Klein, o.b.klein@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+/*
+ History:
+ 10/23/2005: First release; only a reader
+ 10/25/2005: becomes a writer too
+ 10/26/2005: received documentation from CompeGPS team
+ added fatals for "G" and "U" if not WGS84 and lat/lon
+ 08/13/2006: switch to gbfile api
+*/
+
+/*
+
+ the meaning of leading characters in CompeGPS data lines (enhanced PCX):
+
+ header lines:
+
+ "G": WGS 84 - Datum of the map
+ "N": Anybody - Name of the user
+ "L": -02:00:00 - Difference to UTC
+ "M": ... - Any comments
+ "R": 16711680 , xxxx , 1 - Route header
+ "U": 1 - System of coordinates (0=UTM 1=Latitude/Longitude)
+
+ "C": 0 0 255 2 -1.000000 - ???
+ "V": 0.0 0.0 0 0 0 0 0.0 - ???
+ "E": 0|1|00-NUL-00 00:00:00|00:00:00|0 - ???
+
+ data lines:
+
+ "W": if(route) routepoint; else waypoint
+ "T": trackpoint
+ "t": if(track) additionally track info
+ if(!track) additionally trackpoint info
+ "a": link to ...
+ "w": waypoint additional info
+
+*/
+
+#include "defs.h"
+#include "cet_util.h"
+#include "csv_util.h"
+
+#if CSVFMTS_ENABLED
+#include <cmath>
+#include "jeeps/gpsmath.h"
+#include <cstdlib>
+#include <cstdio>
+
+#define MYNAME "CompeGPS"
+
+#define SHORT_NAME_LENGTH 16
+
+static gbfile* fin, *fout;
+static int target_index, curr_index;
+static int track_info_flag;
+static short_handle sh;
+static int snlen;
+static int radius;
+static int input_datum;
+
+static const route_head* curr_track;
+
+/* placeholders for options */
+
+static char* option_icon;
+static char* option_index;
+static char* option_radius;
+static char* option_snlen;
+
+static
+QVector<arglist_t> compegps_args = {
+ {
+ "deficon", &option_icon, "Default icon name",
+ nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "index", &option_index, "Index of route/track to write (if more than one in source)",
+ nullptr, ARGTYPE_INT, "1", nullptr, nullptr
+ },
+ {
+ "radius", &option_radius, "Give points (waypoints/route points) a default radius (proximity)",
+ nullptr, ARGTYPE_FLOAT, "0", nullptr, nullptr
+ },
+ {
+ "snlen", &option_snlen, "Length of generated shortnames (default 16)",
+ "16", ARGTYPE_INT, "1", nullptr, nullptr
+ },
+};
+
+static
+void fix_datum(double* lat, double* lon)
+{
+ double amt;
+
+ /*
+ * Avoid FP jitter in the common case.
+ */
+ if (input_datum != DATUM_WGS84) {
+ GPS_Math_Known_Datum_To_WGS84_M(*lat, *lon, 0.0, lat, lon,
+ &amt, input_datum);
+ }
+}
+
+static void
+compegps_parse_date(const char* c, QDate& date)
+{
+ date = QDate::fromString(c, "dd-MMM-yy");
+ // If that worked, fix 1900 bias to 2000 bias. Some have full 4 digits.
+ if (date.isValid()) {
+ date = date.addYears(100);
+ } else {
+ date = QDate::fromString(c, "dd-MMM-yyyy");
+ }
+}
+
+static void
+compegps_parse_time(const char* c, QTime& time)
+{
+ time = QTime::fromString(c, "hh:mm:ss");
+}
+
+/* specialized readers */
+
+static Waypoint*
+parse_wpt(char* buff)
+{
+ int col = -1;
+ char* cx;
+ auto* wpt = new Waypoint;
+ int has_time = 0;
+ QDate date;
+ QTime time;
+
+ char* c = strstr(buff, "A ");
+ if (c == buff) {
+ col++;
+ }
+
+ c = csv_lineparse(buff, " ", "", col++);
+ while (c != nullptr) {
+ c = lrtrim(c);
+ if (*c != '\0') {
+#if 0
+ printf(MYNAME "_read_wpt: col(%d)=%s\n", col, c);
+#endif
+ switch (col) {
+ case 0:
+
+ cx = c + strlen(c) - 1; /* trim trailing underscores */
+ while ((cx >= c) && (*cx == '_')) {
+ *cx-- = '\0';
+ }
+ if (*c != '\0') {
+ wpt->shortname = c;
+ }
+ break;
+ case 2:
+ human_to_dec(c, &wpt->latitude, nullptr, 1);
+ break;
+ case 3:
+ human_to_dec(c, nullptr, &wpt->longitude, 2);
+ break;
+ // Older compegps used a dumb constant.
+ // Report are that 2010-era writes a sensible
+ // value here.
+ /* always "27-MAR-62 00:00:00" */
+ case 4:
+ if (strcmp(c, "27-MAR-62")) {
+ has_time = 1;
+ compegps_parse_date(c, date);
+ }
+ break;
+ case 5:
+ if (has_time) {
+ compegps_parse_time(c, time);
+ wpt->SetCreationTime(QDateTime(date, time, Qt::UTC));
+ }
+ break;
+ case 6:
+ wpt->altitude = atof(c);
+ break;
+ case 7:
+ wpt->description = c;
+ break;
+ default:
+ if (col > 7) {
+ wpt->description += " ";
+ wpt->description += c;
+ }
+ }
+ }
+ c = csv_lineparse(nullptr, " ", "", col++);
+ }
+ fix_datum(&wpt->latitude, &wpt->longitude);
+ return wpt;
+}
+
+static void
+parse_wpt_info(const char* buff, Waypoint* wpt) /* "w" */
+{
+ int col = -1;
+ double fx;
+
+ char* c = csv_lineparse(buff, ",", "", col++);
+ while (c != nullptr) {
+ c = lrtrim(c);
+ if (*c != '\0') {
+#if 0
+ printf(MYNAME "_read_wpt_info: col(%d)=%s\n", col, c);
+#endif
+ switch (col) {
+ case 0:
+ wpt->icon_descr = c;
+ break;
+ case 1:
+ break; /* Text postion */
+ case 2:
+ break; /* Lens zoom level */
+ case 3:
+ break; /* Text colour */
+ case 4:
+ break; /* Background colour */
+ case 5:
+ break; /* Transparent text (0=transparent, 1=no transparent) */
+ case 6:
+ break; /* ??? */
+ case 7:
+ break; /* ??? */
+ case 8: /* radius */
+ fx = atof(c);
+ if (fx > 0) {
+ WAYPT_SET(wpt, proximity, fx);
+ }
+ break;
+ }
+ }
+ c = csv_lineparse(nullptr, ",", "", col++);
+ }
+}
+
+static Waypoint*
+parse_trkpt(char* buff)
+{
+ int col = -1;
+ auto* wpt = new Waypoint;
+ QDate date;
+ QTime time;
+
+ char* c = strstr(buff, "A ");
+ if (c == buff) {
+ col++;
+ }
+
+ c = csv_lineparse(buff, " ", "", col++);
+ while (c != nullptr) {
+ c = lrtrim(c);
+ if (*c != '\0') {
+#if 0
+ printf(MYNAME "_read_trkpt: col(%d)=%s\n", col, c);
+#endif
+ switch (col) {
+ case 2:
+ human_to_dec(c, &wpt->latitude, nullptr, 1);
+ break;
+ case 3:
+ human_to_dec(c, nullptr, &wpt->longitude, 2);
+ break;
+ case 4:
+ compegps_parse_date(c, date);
+ break;
+ case 5:
+ compegps_parse_time(c, time);
+ wpt->SetCreationTime(QDateTime(date, time, Qt::UTC));
+ break;
+ case 7:
+ wpt->altitude = atof(c);
+ break;
+ }
+ }
+ c = csv_lineparse(nullptr, " ", "", col++);
+ }
+ fix_datum(&wpt->latitude, &wpt->longitude);
+ return wpt;
+}
+
+static void
+parse_track_info(const char* buff, route_head* track) /* "t" */
+{
+ int col = -1;
+
+ char* c = csv_lineparse(buff, "|", "", col++);
+ while (c != nullptr) {
+ c = lrtrim(c);
+ if (*c != '\0') {
+#if 0
+ printf(MYNAME "_read_track_info: col(%d)=%s\n", col, c);
+#endif
+ switch (col) {
+ case 0:
+ break; /* unknown field */
+ case 1:
+ track->rte_name = c;
+ break;
+ case 2:
+ break; /* unknown field */
+ case 3:
+ break; /* unknown field */
+ }
+ }
+ c = csv_lineparse(nullptr, "|", "", col++);
+ }
+}
+
+static void
+parse_rte_info(const char* buff, route_head* route) /* "R" */
+{
+ int col = -1;
+
+ char* c = csv_lineparse(buff, ",", "", col++);
+ while (c != nullptr) {
+ c = lrtrim(c);
+ if (*c != '\0') {
+#if 0
+ printf(MYNAME "_read_rte_info: col(%d)=%s\n", col, c);
+#endif
+ switch (col) {
+ case 0:
+ break; /* unknown field (colour?) */
+ case 1:
+ route->rte_name = c;
+ break;
+ case 2:
+ break; /* unknown field */
+
+ }
+ }
+ c = csv_lineparse(nullptr, ",", "", col++);
+ }
+}
+
+/* main functions */
+
+static void
+compegps_rd_init(const QString& fname)
+{
+ fin = gbfopen(fname, "rb", MYNAME);
+ input_datum = DATUM_WGS84;
+}
+
+static void
+compegps_rd_deinit()
+{
+ gbfclose(fin);
+}
+
+static void
+compegps_data_read()
+{
+ char* buff;
+ int line = 0;
+ Waypoint* wpt = nullptr;
+ route_head* route = nullptr;
+ route_head* track = nullptr;
+
+ while ((buff = gbfgetstr(fin))) {
+ if ((line++ == 0) && fin->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+ char* cin = lrtrim(buff);
+ if (strlen(cin) == 0) {
+ continue;
+ }
+
+ char* ctail = strchr(cin, ' ');
+ if (ctail == nullptr) {
+ continue;
+ }
+ ctail = lrtrim(ctail);
+
+ switch (*cin) {
+ case 'G':
+ input_datum = GPS_Lookup_Datum_Index(ctail);
+ if (input_datum < 0) {
+ fatal(MYNAME ": Unsupported datum \"%s\"!", ctail);
+ }
+ break;
+ case 'U':
+ switch (*ctail) {
+ case '1': /* lat/lon, that's we want to see */
+ break;
+ case '0': /* UTM not supported yet */
+ fatal(MYNAME "Sorry, UTM is not supported yet!\n");
+ default:
+ fatal(MYNAME "Invalid system of coordinates (%s)!\n", cin);
+ }
+ break;
+ case 'R':
+ route = new route_head;
+ route_add_head(route);
+ parse_rte_info(ctail, route);
+ break;
+ case 'M':
+ break;
+ case 'W':
+ wpt = parse_wpt(ctail);
+ if (wpt != nullptr) {
+ if (route != nullptr) {
+ route_add_wpt(route, wpt);
+ } else {
+ waypt_add(wpt);
+ }
+ }
+ break;
+ case 'w':
+ is_fatal((wpt == nullptr), MYNAME ": No waypoint data before \"%s\"!", cin);
+ parse_wpt_info(ctail, wpt);
+ break;
+ case 'T':
+ wpt = parse_trkpt(ctail);
+ if (wpt != nullptr) {
+ if (track == nullptr) {
+ track = new route_head;
+ track_add_head(track);
+ }
+ track_add_wpt(track, wpt);
+ }
+ break;
+ case 't':
+ if (track != nullptr) {
+ parse_track_info(ctail, track);
+ }
+ break;
+ }
+ }
+}
+
+/* ----------------------------------------------------------- */
+
+static void
+write_waypt_cb(const Waypoint* wpt)
+{
+ if (curr_index != target_index) {
+ return;
+ }
+
+ // Our only output cleansing is to replace
+ QString cleaned_name(wpt->shortname);
+ cleaned_name.replace(' ', '_');
+
+ QString name = (snlen > 0) ? mkshort(sh, cleaned_name) : cleaned_name;
+
+ gbfprintf(fout, "W %s A ", CSTR(name));
+ gbfprintf(fout, "%.10f%c%c ",
+ fabs(wpt->latitude), 0xBA, (wpt->latitude >= 0) ? 'N' : 'S');
+ gbfprintf(fout, "%.10f%c%c ",
+ fabs(wpt->longitude), 0xBA, (wpt->longitude >= 0) ? 'E' : 'W');
+ gbfprintf(fout, "27-MAR-62 00:00:00 %.6f",
+ (wpt->altitude != unknown_alt) ? wpt->altitude : 0.0);
+ if (wpt->description != nullptr) {
+ gbfprintf(fout, " %s", CSTRc(wpt->description));
+ }
+ gbfprintf(fout, "\n");
+
+ if ((!wpt->icon_descr.isNull()) || (wpt->wpt_flags.proximity) || \
+ (option_icon != nullptr)) {
+ gbfprintf(fout, "w %s,0,0.0,16777215,255,1,7,,%.1f\n",
+ wpt->icon_descr.isNull() ? "Waypoint" : CSTR(wpt->icon_descr),
+ WAYPT_GET(wpt, proximity, 0));
+ }
+}
+
+static void
+write_route_hdr_cb(const route_head* rte)
+{
+ curr_index++;
+ if (curr_index != target_index) {
+ return;
+ }
+
+ QString name = rte->rte_name;
+ if (name != nullptr) {
+ name = csv_stringclean(name, ",");
+ } else {
+ name = " ";
+ }
+ gbfprintf(fout, "R 16711680,%s,1,-1\n", CSTR(name));
+}
+
+static void
+write_route()
+{
+ curr_index = 0;
+ route_disp_all(write_route_hdr_cb, nullptr, write_waypt_cb);
+}
+
+static void
+write_track_hdr_cb(const route_head* trk)
+{
+ track_info_flag = 0;
+ curr_track = trk;
+
+ curr_index++;
+ if (curr_index != target_index) {
+ return;
+ }
+
+ track_info_flag = 1;
+}
+
+static void
+write_trkpt_cb(const Waypoint* wpt)
+{
+ if ((curr_index != target_index) || (wpt == nullptr)) {
+ return;
+ }
+
+ QDateTime default_dt(QDate(1970,1,1), QTime(0,0,0), Qt::UTC);
+ auto dt = wpt->creation_time.isValid() ? wpt->GetCreationTime() : default_dt;
+ QString buff = dt.toString("dd-MMM-yy hh:mm:ss").toUpper();
+
+ gbfprintf(fout, "T A %.10f%c%c %.10f%c%c ",
+ fabs(wpt->latitude), 0xBA, (wpt->latitude >= 0) ? 'N' : 'S',
+ fabs(wpt->longitude), 0xBA, (wpt->longitude >= 0) ? 'E' : 'W');
+ gbfprintf(fout, "%s s %.1f %.1f %.1f %.1f %d ",
+ CSTR(buff),
+ wpt->altitude,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0);
+ gbfprintf(fout, "%.1f %.1f %.1f %.1f %.1f\n",
+ -1000.0,
+ -1.0,
+ -1.0,
+ -1.0,
+ -1.0);
+ if (track_info_flag != 0) {
+ track_info_flag = 0;
+ if (curr_track->rte_name != nullptr) {
+ QString name = csv_stringclean(curr_track->rte_name, "|");
+ gbfprintf(fout, "t 4294967295|%s|-1|-1\n", CSTR(name));
+ }
+ }
+}
+
+static void
+write_track()
+{
+ curr_index = 0;
+
+// gbfprintf(fout, "L +02:00:00\n");
+ track_disp_all(write_track_hdr_cb, nullptr, write_trkpt_cb);
+ gbfprintf(fout, "F 1234\n");
+}
+
+static void
+write_waypoints()
+{
+ waypt_disp_all(write_waypt_cb);
+}
+
+/* --------------------------------------------------------------------------- */
+
+static void
+compegps_wr_init(const QString& fname)
+{
+ fout = gbfopen(fname, "w", MYNAME);
+ sh = mkshort_new_handle();
+}
+
+static void
+compegps_wr_deinit()
+{
+ mkshort_del_handle(&sh);
+ gbfclose(fout);
+}
+
+static void
+compegps_data_write()
+{
+ /* because of different file extensions we can only write one GPS data type at time */
+
+ gbfprintf(fout, "G WGS 84\n");
+ gbfprintf(fout, "U 1\n");
+
+ /* process options */
+
+ target_index = 1;
+ if (option_index != nullptr) {
+ target_index = atoi(option_index);
+ }
+
+ snlen = 0;
+ if (global_opts.synthesize_shortnames != 0) {
+ if (option_snlen != nullptr) {
+ snlen = atoi(option_snlen);
+ } else {
+ snlen = SHORT_NAME_LENGTH;
+ }
+
+ is_fatal((snlen < 1), MYNAME "Invalid length for generated shortnames!");
+
+ setshort_whitespace_ok(sh, 0);
+ setshort_length(sh, snlen);
+ }
+
+ radius = -1;
+ if (option_radius != nullptr) {
+ radius = atof(option_radius);
+ is_fatal((radius <= 0.0), MYNAME "Invalid value for radius!");
+ }
+
+ if (option_icon != nullptr) {
+ if (*option_icon == '\0') {
+ option_icon = nullptr;
+ } else if (case_ignore_strcmp(option_icon, "deficon") == 0) {
+ option_icon = nullptr;
+ }
+ }
+
+ switch (global_opts.objective) {
+ case wptdata:
+ case unknown_gpsdata:
+ curr_index = target_index = 0;
+ write_waypoints();
+ break;
+ case trkdata:
+ write_track();
+ break;
+ case rtedata:
+ write_route();
+ break;
+ case posndata:
+ fatal(MYNAME ": Realtime positioning not supported.\n");
+ break;
+ }
+}
+
+/* --------------------------------------------------------------------------- */
+
+ff_vecs_t compegps_vecs = {
+ ff_type_file,
+ FF_CAP_RW_ALL,
+ compegps_rd_init,
+ compegps_wr_init,
+ compegps_rd_deinit,
+ compegps_wr_deinit,
+ compegps_data_read,
+ compegps_data_write,
+ nullptr,
+ &compegps_args,
+ CET_CHARSET_MS_ANSI, 1
+ , NULL_POS_OPS,
+ nullptr
+};
+#endif /* CSVFMTS_ENABLED */
--- /dev/null
+/*
+
+ Support for G7ToWin data files (.g7t),
+ Copyright (C) 2007 Olaf Klein, o.b.klein@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+/*
+ History:
+ 04/07/2007: start programming
+ 04/15/2007: added to gpsbabel
+*/
+
+#include "defs.h"
+#include "cet_util.h"
+#include "csv_util.h"
+#include "garmin_fs.h"
+#include "garmin_tables.h"
+#include "jeeps/gpsmath.h"
+#include "strptime.h"
+
+#include <cstdio>
+#include <cstdlib>
+#include <ctime>
+
+#if CSVFMTS_ENABLED
+
+#define MYNAME "g7towin"
+
+#define G7T_HEADER "Version 2:G7T"
+
+static gbfile* fin;
+static grid_type grid;
+static int datum;
+static gpsdata_type mode;
+static double altf;
+static int gardown;
+static int event_ct;
+
+static
+QVector<arglist_t> g7towin_args = {
+};
+
+#define WAYPT__OFS 0x00000
+#define TRKPT__OFS 0x01000
+
+#define WPT_c0_OFS 0x0c000
+#define WPT_c1_OFS 0x0c100
+#define WPT_c2_OFS 0x0c200
+#define WPT_c3_OFS 0x0c300
+#define WPT_c4_OFS 0x0c400
+#define WPT_c5_OFS 0x0c500
+#define WPT_c6_OFS 0x0c600
+#define WPT_c7_OFS 0x0c700
+#define WPT_c8_OFS 0x0c800
+#define WPT_cA_OFS 0x0cA00
+#define WPT_cB_OFS 0x0cB00
+#define WPT_cC_OFS 0x0cC00
+#define WPT_cD_OFS 0x0cD00
+
+static void
+parse_line(char* buff, int index, const char* delimiter, Waypoint* wpt)
+{
+ char* cin;
+ garmin_fs_t* gmsd = garmin_fs_t::find(wpt);
+
+ while ((cin = csv_lineparse(buff, delimiter, "", index++))) {
+
+ buff = nullptr;
+ cin = lrtrim(cin);
+
+ if ((*cin == '\0') ||
+ (strcmp(cin, "INF") == 0) ||
+ (strcmp(cin, "1e25") == 0) ||
+ (strcmp(cin, "1.0e25") == 0)) {
+ continue;
+ }
+
+ switch (index) {
+
+ int categories;
+ struct tm tm;
+ char* cerr;
+
+ case TRKPT__OFS + 1:
+ cin += parse_coordinates(cin, datum, grid,
+ &wpt->latitude, &wpt->longitude, MYNAME);
+ while (isspace(*cin)) {
+ cin++;
+ }
+
+ memset(&tm, 0, sizeof(tm));
+ cerr = strptime(cin, "%a %b %d %H:%M:%S %Y", &tm);
+ if (cerr == nullptr) {
+ fatal(MYNAME ": Unable to convert date (%s)!\n", cin);
+ }
+ wpt->SetCreationTime(mkgmtime(&tm));
+ break;
+
+ case WAYPT__OFS + 1:
+ wpt->description = (cin);
+ break;
+
+ case WAYPT__OFS + 2:
+ wpt->icon_descr = gt_find_desc_from_icon_number(
+ atoi(cin), PCX);
+ break;
+
+ case WAYPT__OFS + 4:
+ if (strcmp(cin, "S+C") == 0) {
+ garmin_fs_t::set_display(gmsd, gt_display_mode_symbol_and_comment);
+ } else if (strcmp(cin, "S") == 0) {
+ garmin_fs_t::set_display(gmsd, gt_display_mode_symbol);
+ } else if (strcmp(cin, "S+N") == 0) {
+ garmin_fs_t::set_display(gmsd, gt_display_mode_symbol_and_name);
+ }
+ break;
+
+ case WPT_cA_OFS + 1:
+ case WPT_c1_OFS + 1:
+ wpt->shortname = cin;
+ break;
+
+ case WPT_cA_OFS + 4:
+ case WPT_c4_OFS + 2:
+ garmin_fs_t::set_city(gmsd, cin);
+ break;
+
+ case WPT_cA_OFS + 5:
+ case WPT_c4_OFS + 3:
+ garmin_fs_t::set_state(gmsd, cin);
+ break;
+
+ case WPT_cA_OFS + 6:
+ case WPT_c4_OFS + 4:
+ garmin_fs_t::set_cc(gmsd, cin);
+ break;
+
+ case WPT_cB_OFS + 1:
+ case WPT_c6_OFS + 2:
+ garmin_fs_t::set_facility(gmsd, cin);
+ break;
+
+ case WPT_cB_OFS + 2:
+ case WPT_c6_OFS + 3:
+ garmin_fs_t::set_addr(gmsd, cin);
+ break;
+
+ case WPT_cB_OFS + 3: /*cross road */
+ case WPT_c6_OFS + 4:
+ garmin_fs_t::set_cross_road(gmsd, cin);
+ break;
+
+ case TRKPT__OFS + 2: /* altitude */
+ case WPT_cC_OFS + 1:
+ case WPT_c5_OFS + 1:
+ case WPT_c8_OFS + 1:
+ wpt->altitude = altf * atof(cin);
+ break;
+
+ case TRKPT__OFS + 3: /* depth */
+ case WPT_cC_OFS + 2:
+ case WPT_c5_OFS + 2:
+ case WPT_c8_OFS + 2:
+ WAYPT_SET(wpt, depth, altf * atof(cin));
+ break;
+
+ case TRKPT__OFS + 10: /* temperature */
+ if (*cin == '|') {
+ cin++; /* in track points */
+ }
+ if (strcmp(cin, "1e25") == 0) {
+ break;
+ }
+ if (strcmp(cin, "1.0e25") == 0) {
+ break;
+ }
+ [[fallthrough]];
+ case WPT_cD_OFS + 1:
+ case WPT_cB_OFS + 6:
+ WAYPT_SET(wpt, temperature, atof(cin));
+ break;
+
+ case WAYPT__OFS + 6: /* proximity */
+ case WPT_cD_OFS + 2:
+ WAYPT_SET(wpt, proximity, atof(cin));
+ break;
+
+ case WPT_cB_OFS + 5:
+ case WPT_cD_OFS + 3:
+ categories = atoi(cin);
+ if (categories != 0) {
+ garmin_fs_t::set_category(gmsd, atoi(cin));
+ }
+ break;
+
+#if 0
+
+ /* currently unused */
+
+ case TRKPT__OFS + 5: /* distance from previous point */
+ case TRKPT__OFS + 6: /* distance from segment start */
+ case TRKPT__OFS + 7: /* distance from start */
+ case TRKPT__OFS + 8: /* velocity from previous point */
+ case TRKPT__OFS + 9: /* time (in seconds) from previous point */
+ break;
+
+ case WAYPT__OFS + 3: /* ignore color */
+ break;
+
+ case WAYPT__OFS + 5: /* always '0' */
+ break;
+
+ case TRKPT__OFS + 4:
+ if (case_ignore_strcmp(cin, "FT") == 0) ;
+ else if (case_ignore_strcmp(cin, "M") == 0) ;
+ else if (case_ignore_strcmp(cin, "SM") == 0) ;
+ else if (case_ignore_strcmp(cin, "NM") == 0) ;
+ else if (case_ignore_strcmp(cin, "KM") == 0) ;
+ break;
+
+ case WPT_cB_OFS + 4: /* unknown (datatype) */
+ break;
+
+ case WPT_cC_OFS + 3: /* waypt_class (always FF) */
+ break;
+
+ case WPT_cC_OFS + 4: /* class & subclass */
+ case WPT_cC_OFS + 5:
+ case WPT_cC_OFS + 6:
+ case WPT_cC_OFS + 7:
+ case WPT_cC_OFS + 8:
+ case WPT_cC_OFS + 9:
+ case WPT_cC_OFS + 10:
+ case WPT_cC_OFS + 11:
+ case WPT_cC_OFS + 12:
+ case WPT_cC_OFS + 13:
+ case WPT_cC_OFS + 14:
+ case WPT_cC_OFS + 15:
+ case WPT_cC_OFS + 16:
+ case WPT_cC_OFS + 17:
+ case WPT_cC_OFS + 18:
+ case WPT_cC_OFS + 19:
+ case WPT_cC_OFS + 20:
+ case WPT_cC_OFS + 21:
+ break;
+
+ case WPT_cC_OFS + 22:
+ /* distance */
+ break;
+#endif
+ }
+ }
+}
+
+static Waypoint*
+parse_waypt(char* buff)
+{
+ char* cin;
+ struct tm tm;
+
+ auto* wpt = new Waypoint;
+ garmin_fs_t* gmsd = garmin_fs_alloc(-1);
+ wpt->fs.FsChainAdd(gmsd);
+
+ if (gardown) {
+ cin = buff + 6;
+ } else {
+ /* We've seen waypoints with length of 14 and 15 !!! */
+ cin = buff + 15;
+ while ((cin > buff) && (! isspace(*cin))) {
+ cin--;
+ }
+ }
+
+ while (isspace(*cin)) {
+ cin--;
+ }
+ if (cin >= buff) {
+ char*s = xstrndup(buff, cin - buff + 1);
+ wpt->shortname = s;
+ xfree(s);
+ }
+
+ if (gardown) {
+ buff += 6;
+ } else {
+ buff += 15;
+ }
+ while (isspace(*buff)) {
+ buff++;
+ }
+
+ buff += parse_coordinates(buff, datum, grid,
+ &wpt->latitude, &wpt->longitude, MYNAME);
+ while (isspace(*buff)) {
+ buff++;
+ }
+
+ memset(&tm, 0, sizeof(tm));
+ char* cerr = strptime(buff, "%a %b %d %H:%M:%S %Y", &tm);
+ if (cerr == nullptr) {
+ fatal(MYNAME ": Unable to convert date (%s)!\n", buff);
+ }
+ wpt->SetCreationTime(mkgmtime(&tm));
+
+ /* go over time stamp */
+ int i = 5;
+ while (buff && i) {
+ i--;
+ buff = strchr(buff, ' ');
+ if (buff) {
+ buff++;
+ }
+ }
+ if (gardown && (buff == nullptr)) {
+ return wpt;
+ }
+ is_fatal((buff == nullptr), MYNAME ": Incomplete waypoint line!");
+
+ while (isspace(*buff)) {
+ buff++;
+ }
+
+ parse_line(buff, WAYPT__OFS, "^", wpt);
+
+ return wpt;
+}
+
+static Waypoint*
+parse_trkpt(char* buff)
+{
+ auto* wpt = new Waypoint;
+ garmin_fs_t* gmsd = garmin_fs_alloc(-1);
+ wpt->fs.FsChainAdd(gmsd);
+
+ parse_line(buff, TRKPT__OFS, ";", wpt);
+
+ return wpt;
+}
+
+/*
+ * parse_categories is currently only a dummy procedure.
+ * w'll need a central storage with binding to the module
+ * which has established a list of category names.
+ */
+
+static void
+parse_categories(char* buff)
+{
+ char* cin;
+ int cat = 0;
+
+ while ((cin = csv_lineparse(buff, ",", "", cat++))) {
+ uint16_t cx;
+
+ buff = nullptr;
+
+ cin = lrtrim(cin);
+ if (*cin == 0) {
+ continue;
+ }
+
+ garmin_fs_convert_category(cin, &cx);
+ }
+}
+
+
+/* main functions */
+
+static void
+rd_init(const QString& fname)
+{
+ fin = gbfopen(fname, "rb", MYNAME);
+
+ gardown = 1;
+ mode = wptdata;
+ grid = grid_lat_lon_dmm;
+ datum = DATUM_WGS84;
+ altf = 1;
+ event_ct = 0;
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(fin);
+}
+
+static void
+data_read()
+{
+ char* buff;
+ int line = 0;
+ Waypoint* wpt = nullptr;
+ route_head* head = nullptr;
+
+ while ((buff = gbfgetstr(fin))) {
+ if ((line++ == 0) && fin->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+
+ char* cin = lrtrim(buff);
+ if (!*cin) {
+ continue;
+ }
+
+ char* cdata = cin+1;
+ while (! isspace(*cdata)) {
+ cdata++;
+ }
+ while (isspace(*cdata)) {
+ cdata++;
+ }
+ if (! *cdata) {
+ continue;
+ }
+
+ switch (*cin) {
+
+ case '#': /* comment */
+ break;
+
+ case 'A':
+ if (case_ignore_strncmp(cdata, "Meter", 5) == 0) {
+ altf = 1.0;
+ } else if (case_ignore_strncmp(cdata, "Feet", 4) == 0) {
+ altf = FEET_TO_METERS(1.0);
+ }
+ break;
+
+ case 'C': /* categories */
+ parse_categories(cdata);
+ break;
+
+ case 'D':
+ datum = gt_lookup_datum_index(cdata, MYNAME);
+ break;
+
+ case 'I': /* event point */
+ wpt = new Waypoint;
+ cdata += parse_coordinates(cdata, datum, grid,
+ &wpt->latitude, &wpt->longitude, MYNAME);
+ wpt->shortname = QString("Event%1").arg(++event_ct);
+ while (isspace(*cdata)) {
+ cdata++;
+ }
+ if (*cdata == ';') {
+ cdata++;
+ wpt->icon_descr = gt_find_desc_from_icon_number(
+ atoi(cdata), PCX);
+ }
+ waypt_add(wpt);
+ break;
+
+ case 'M':
+ grid = gt_lookup_grid_type(cdata, MYNAME);
+ break;
+
+ case 'P': /* proximity waypoint */
+ case 'W': /* normal waypoint */
+ wpt = parse_waypt(cin + 3);
+ if (wpt) {
+ if (mode == rtedata) {
+ route_add_wpt(head, wpt);
+ } else {
+ waypt_add(wpt);
+ }
+ }
+ break;
+
+ case 'c': /* additional lines */
+ switch (*(cin+1)) {
+ int index;
+
+ case 'A':
+ case 'B':
+ case 'C':
+ case 'D':
+
+ index = WPT_cA_OFS + ((*(cin+1) - 'A') * 256);
+ parse_line(cdata, index, "|", wpt);
+ break;
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+
+ index = WPT_c0_OFS + ((*(cin+1) - '0') * 256);
+ parse_line(cdata, index, ";", wpt);
+ break;
+
+ case 'L':
+ waypt_add_url(wpt, cdata, nullptr);
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case 'N': /* track log header */
+ mode = trkdata;
+ head = new route_head;
+ cdata = strchr(cdata, '-');
+ if (cdata) {
+ while (isspace(*cdata)) {
+ cdata++;
+ }
+ if (*cdata) {
+ char* s = strrchr(cdata, ',');
+ if (s) {
+ *s = '\0';
+ s = strrchr(cdata, ',');
+ if (s) {
+ *s = '\0';
+ head->rte_name = cdata;
+ }
+ }
+ }
+ }
+ track_add_head(head);
+ break;
+
+ case 'R': /* route header */
+ mode = rtedata;
+ head = new route_head;
+ cdata += 3; /*skip route number */
+ if (*cdata) {
+ head->rte_name = cdata;
+ }
+ route_add_head(head);
+ break;
+
+ case 'T':
+ wpt = parse_trkpt(cdata);
+ if (wpt) {
+ track_add_wpt(head, wpt);
+ }
+ break;
+
+ case 'V':
+ if (strcmp(cin, G7T_HEADER) != 0) {
+ fatal(MYNAME ": Invalid version or invalid file!\n");
+ }
+ gardown = 0;
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+/* --------------------------------------------------------------------------- */
+
+ff_vecs_t g7towin_vecs = {
+ ff_type_file,
+ { ff_cap_read, ff_cap_read, ff_cap_read },
+ rd_init,
+ nullptr,
+ rd_deinit,
+ nullptr,
+ data_read,
+ nullptr,
+ nullptr,
+ &g7towin_args,
+ CET_CHARSET_MS_ANSI, 0
+ , NULL_POS_OPS,
+ nullptr
+};
+
+#endif /* CSVFMTS_ENABLED */
--- /dev/null
+/*
+
+
+ Copyright (C) 2008 Dr. J�rgen Neumann, Juergen.Neumann@online.de
+ Copyright (C) 2005 Robert Lipe, robertlipe+source@gpsbabel.org (based on nmea.c)
+ Copyright (C) 20XX probably many others from the gpsbabel development team ;-)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ =====================================================================================
+
+ This file allows gpsbabel to read and write the internal track log format used by
+ GoPal navigation systems. They produce a simple line-oriented format with one point per
+ second. Unfortunately the the data does not contain a valid date, only some kind of timetick,
+ together with each point (perhaps by mistake ??). So we have to parse the filename for a valid starting
+ date and add the timeoffset. Second problem (at least to me) was that irregularly stupid errors were
+ in the data, i.e. only one data point shows a totally wrong longitude or latitude. Everything else in
+ the dataset seems ok, so I needed a way to sort out these errors. My solution is to calculate the speed
+ between successive points and drop points not between minspeed and maxspeed. This way I can sort out most
+ of this annoying bugs, a side effect is that if a minimum speed > 0 is set points with the same coordinates are also
+ dropped.
+
+ Fileformat GoPal
+ TICK; TIME UTC; LONG; LAT; HEIGHT; SPEED km/h; FIX; HDOP; SAT
+ 3801444, 080558, 2.944362, 43.262117, 295.28, 0.12964, 2, 2.900000, 3
+ Filenames:
+ trackYYYYMMDD_HHMMSS.trk
+ A_YYYYMMDD_HHMMSS.trk
+ with HHMMSS local time (not UTC)
+
+ History
+ 2008-07-18 initial release of Version 0.1
+ 2008-07-26 bugfix: filenamehandling linux, format specification in write statement
+
+ ToDo:
+ - check for midnight & adjust
+*/
+
+#include "defs.h"
+#include "cet_util.h"
+#include "csv_util.h"
+#include "grtcirc.h"
+#include "jeeps/gpsmath.h"
+#include "strptime.h"
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+#include <QDateTime>
+#include <QString>
+
+#define MYNAME "gopal"
+
+static gbfile* fin, *fout;
+
+static struct tm tm,filenamedate, trackdate;
+static time_t tx;
+static char* optdate=nullptr;
+static char* optmaxspeed=nullptr;
+static char* optminspeed=nullptr;
+static char* optclean= nullptr;
+static double minspeed,maxspeed;
+static struct tm opt_tm; /* converted "date" parameter */
+static
+QVector<arglist_t> gopal_args = {
+ {"date", &optdate, "Complete date-free tracks with given date (YYYYMMDD).", nullptr, ARGTYPE_INT, ARG_NOMINMAX, nullptr },
+ {"maxspeed", &optmaxspeed, "The maximum speed (km/h) traveling from waypoint to waypoint.", "200", ARGTYPE_INT, "1", "1000", nullptr },
+ {"minspeed", &optminspeed, "The minimum speed (km/h) traveling from waypoint to waypoint. Set >0 to remove duplicate waypoints", "0", ARGTYPE_INT, "0", "999", nullptr },
+ {"clean", &optclean, "Cleanup common errors in trackdata", "1", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr },
+};
+
+#define CHECK_BOOL(a) if (a && (*a == '0')) a = NULL
+
+static int gopal_check_line(char* line)
+{
+ char* c = line;
+ int i = 0;
+ while ((c = strchr(c, ','))) {
+ c++;
+ i++;
+ }
+ return i;
+}
+
+
+
+/*******************************************************************************
+* %%% global callbacks called by gpsbabel main process %%% *
+*******************************************************************************/
+
+static void
+gopal_rd_init(const QString& fname)
+{
+ CHECK_BOOL(optclean);
+ if (optminspeed) {
+ minspeed=atof(optminspeed);
+ if (global_opts.debug_level > 1) {
+ fprintf(stderr,"options from command line : gopal minspeed = %s\n",optminspeed);
+ }
+ } else {
+ minspeed=0;
+ }
+ if (optmaxspeed) {
+ maxspeed=atof(optmaxspeed);
+ if (global_opts.debug_level > 1) {
+ fprintf(stderr,"options from command line : gopal maxspeed = %s\n",optmaxspeed);
+ }
+ } else {
+ maxspeed=200;
+ }
+ if (global_opts.debug_level > 1) {
+ fprintf(stderr,"setting minspeed to %5.1lf km/h and maxspeed to %5.1lf km/h\n",minspeed,maxspeed);
+ }
+
+ fin = gbfopen(fname, "r", MYNAME);
+
+ if (optdate) {
+ memset(&opt_tm, 0, sizeof(opt_tm));
+
+ char* ck = strptime(optdate, "%Y%m%d", &opt_tm);
+ if ((ck == nullptr) || (*ck != '\0') || (strlen(optdate) != 8)) {
+ fatal(MYNAME ": Invalid date \"%s\"!\n", optdate);
+ } else if (opt_tm.tm_year < 70) {
+ fatal(MYNAME ": Date \"%s\" is out of range (have to be 19700101 or later)!\n", optdate);
+ }
+ tx = mkgmtime(&opt_tm);
+
+ } else {
+ /* remove path */
+ QString filename = get_filename(fname);
+ QString datestr;
+
+ if (filename.startsWith("track")&&(filename.length()>13)) { // we need at least 13 letters: trackYYYYMMDD...
+ datestr = filename.mid(5,8);
+ } else if (filename.startsWith("A_")&&(filename.length()>10)) { // here we expect at least 10 letters: A_YYYYMMDD...
+ datestr = filename.mid(2,8);
+ }
+ // in buff we should now have something which looks like a valid date starting with YYYYMMDD
+ /*ck = (char*)*/strptime(qPrintable(datestr), "%Y%m%d", &filenamedate);
+ // if (((ck == NULL) || (*ck != '\0') )&&!(optdate))
+ // fatal(MYNAME ": Invalid date in filename \"%s\", try to set manually using \"date\" switch!\n", buff);
+ // /* else */ if (filenamedate.tm_year < 70)
+ // fatal(MYNAME ": Date \"%s\" is out of range (have to be 19700101 or later)!\n", buff);
+ // tx= mkgmtime(&filenamedate);
+ }
+}
+
+static void
+gopal_rd_deinit()
+{
+ gbfclose(fin);
+}
+
+static void
+gopal_read()
+{
+
+ char* buff;
+ double hmsd;
+ int fix;
+ int hms;
+ Waypoint* lastwpt=nullptr;
+ char tbuffer[64];
+ struct tm tm2;
+ double lat_old = 0;
+
+
+ auto* route = new route_head;
+ QDateTime qtx = QDateTime::fromSecsSinceEpoch(tx, Qt::UTC);
+ route->rte_name = "Tracklog ";
+ route->rte_name += qtx.toString(Qt::ISODate);
+ route_add_head(route);
+
+ long line = 0;
+ while ((buff = gbfgetstr(fin))) {
+ if ((line == 0) && fin->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+
+ char* str = buff = lrtrim(buff);
+ if (*buff == '\0') {
+ continue;
+ }
+ int nfields = gopal_check_line(buff);
+ if ((nfields != 8) && (nfields != 11)) {
+ continue;
+ }
+ // Old format. Hassle for date.
+ if ((nfields == 8) && (tx == 0)) {
+ // fatal(MYNAME ": Invalid date in filename \"%s\", try to set manually using \"date\" switch!\n", buff);
+ }
+ auto* wpt = new Waypoint;
+
+ int column = -1;
+ // the format of gopal is quite simple. Unfortunately the developers forgot the date as the first element...
+ //TICK; TIME; LONG; LAT; HEIGHT; SPEED; Fix; HDOP; SAT
+ //3801444, 080558, 2.944362, 43.262117, 295.28, 0.12964, 2, 2.900000, 3
+ char* c = csv_lineparse(str, ",", "", column++);
+ int millisecs = 0;
+ while (c != nullptr) {
+ switch (column) {
+ case 0: /* "-" */ /* unknown fields for the moment */
+ unsigned long microsecs;
+ sscanf(c, "%lu", µsecs);
+ // Just save this; we'll use it on the next field.
+ millisecs = lround((microsecs % 1000000) / 1000.0);
+ break;
+ case 1: /* Time UTC */
+ sscanf(c,"%lf",&hmsd);
+ hms = (int) hmsd;
+ tm.tm_sec = hms % 100;
+ hms = hms / 100;
+ tm.tm_min = hms % 100;
+ hms = hms / 100;
+ tm.tm_hour = hms % 100;
+ tm.tm_year=trackdate.tm_year;
+ tm.tm_mon=trackdate.tm_mon;
+ tm.tm_mday=trackdate.tm_mday;
+ // This will probably be overwritten by field 9...if we have 9 fields.
+ wpt->SetCreationTime(tx+((((time_t)tm.tm_hour * 60) + tm.tm_min) * 60) + tm.tm_sec);
+ wpt->creation_time = wpt->creation_time.addMSecs(millisecs);
+ if (global_opts.debug_level > 1) {
+ time_t t = wpt->GetCreationTime().toTime_t();
+ strftime(tbuffer, sizeof(tbuffer), "%c", gmtime(&t));
+ printf("parsed timestamp: %s\n",tbuffer);
+ }
+ break;
+
+ case 2: /* longitude */
+ sscanf(c, "%lf", &wpt->longitude);
+ break;
+
+ case 3: /* latitude */
+ sscanf(c, "%lf", &wpt->latitude);
+ break;
+ case 4: /* altitude */
+ sscanf(c, "%lf", &wpt->altitude);
+ break;
+ case 5: /* speed */
+ //sscanf(c, "%lf", &wpt->speed);
+ wpt->speed=atof(c);
+ if (global_opts.debug_level > 1) {
+ printf("parsed speed: %8.5f\n",wpt->speed);
+ }
+ break;
+ case 6: /* type of fix */
+ sscanf(c, "%d", &fix);
+ //my device shows only 0 or 2
+ //should i guess from no of sats if 2d or 3d?
+ switch (fix) {
+ case 0:
+ wpt->fix = fix_none;
+ break;
+ case 2:
+ wpt->fix = fix_2d;
+ break;
+ //case 3: wpt->fix = fix_3d;break;
+ //case 4: wpt->fix = fix_dgps;break; /* 2D_diff */
+ //case 5: wpt->fix = fix_dgps;break; /* 3D_diff */
+ default:
+ wpt->fix = fix_unknown;
+ break;
+ }
+ break;
+ case 7: /* hdop */
+ wpt->hdop = atof(c);
+ //sscanf(c, "%lf", &wpt->hdop); does not work ???
+ //wpt->vdop=0;wpt->hdop=0;
+ break;
+ case 8: /* number of sats */
+ sscanf(c, "%d", &wpt->sat);
+ break;
+ // Somewhere around mid/late 2009, these files started
+ // seeing 11 fields.
+ case 9:
+ memset(&tm2, 0, sizeof(tm2));
+ if (!strptime(c, "%Y%m%d", &tm2)) {
+ fatal("Bad date '%s'.\n", c);
+ }
+ wpt->creation_time = wpt->creation_time.addSecs(mkgmtime(&tm2));
+ break;
+ case 10: // Unknown. Ignored.
+ case 11: // Bearing. Ignored.
+ break;
+ }
+ c = csv_lineparse(nullptr, ",", "", column++);
+ }
+ line++;
+
+ if ((wpt->fix != fix_none)&&(lat_old==0)) { //first-time init
+ lat_old=wpt->latitude;
+ //route_add_wpt(route, wpt);
+ lastwpt=wpt;
+ }
+ //calculate the speed to reach this waypoint from the last. This way I try to sort out invalid waypoints
+ double speed = 0;
+ if (lastwpt !=nullptr) {
+ speed=3.6*radtometers(gcdist(RAD(lastwpt->latitude), RAD(lastwpt->longitude), RAD(wpt->latitude), RAD(wpt->longitude))) /
+ abs((int)(wpt->creation_time.toTime_t() - lastwpt->GetCreationTime().toTime_t()));
+ //printf("speed line %d %lf \n",line,speed);
+ }
+ /* Error handling: in the tracklog of my device sometimes "jump" waypoints ;-) */
+ if ((optclean) &&
+ (((wpt->longitude==0.0)|| (wpt->latitude==0.0)||(std::abs(wpt->latitude)>90)||(std::abs(wpt->longitude)>180))||
+ ((speed>maxspeed)||(speed<minspeed)))
+ ) {
+ if (global_opts.debug_level > 1) {
+ fprintf(stderr,"Problem in or around line %5ld: \"%s\" %lf km/h\n",line,buff,speed);
+ }
+ } else {
+ if (global_opts.debug_level > 1) {
+ fprintf(stderr,"valid line %5ld: \"%s\" %lf km/h\n",line,buff,speed);
+ }
+ lastwpt=wpt;
+ lat_old=wpt->latitude;
+ route_add_wpt(route,wpt);
+ waypt_add(new Waypoint(*wpt));
+ }
+ }
+}
+
+static void
+gopal_write_waypt(const Waypoint* wpt)
+{
+ int fix=fix_unknown;
+ //TICK; TIME; LONG; LAT; HEIGHT; SPEED; UN; HDOP; SAT
+ //3801444, 080558, 2.944362, 43.262117, 295.28, 0.12964, 2, 2.900000, 3
+ QString tbuffer = wpt->creation_time.toString("HHmmss");
+ if (wpt->fix!=fix_unknown) {
+ switch (wpt->fix) {
+ case fix_none:
+ fix = 0;
+ break;
+ case fix_2d:
+ fix = 2;
+ break;
+ default:
+ fix = 0;
+ break;
+ }
+ }
+ //MSVC handles time_t as int64, gcc and mac only int32, so convert it:
+ unsigned long timestamp = (unsigned long)wpt->GetCreationTime().toTime_t();
+ gbfprintf(fout, "%lu, %s, %lf, %lf, %5.1lf, %8.5lf, %d, %lf, %d\n",timestamp, CSTR(tbuffer), wpt->longitude, wpt->latitude,wpt->altitude,
+ wpt->speed,fix,wpt->hdop,wpt->sat);
+}
+
+
+static void
+gopal_wr_init(const QString& fname)
+{
+ fout = gbfopen(fname, "w", MYNAME);
+}
+
+static void
+gopal_wr_deinit()
+{
+ gbfclose(fout);
+}
+
+static void
+gopal_write()
+{
+ route_disp_all(nullptr, nullptr, gopal_write_waypt);
+}
+
+/**************************************************************************/
+
+// capabilities below means: we can only read and write waypoints
+//
+
+ff_vecs_t gopal_vecs = {
+ ff_type_file,
+ {
+ ff_cap_none /* waypoints */,
+ (ff_cap)(ff_cap_read | ff_cap_write) /* tracks */,
+ ff_cap_none /* routes */
+ },
+ gopal_rd_init,
+ gopal_wr_init,
+ gopal_rd_deinit,
+ gopal_wr_deinit,
+ gopal_read,
+ gopal_write,
+ nullptr,
+ &gopal_args,
+ CET_CHARSET_ASCII, 0 /* ascii is the expected character set */
+ /* not fixed, can be changed through command line parameter */
+ , NULL_POS_OPS,
+ nullptr
+};
+/**************************************************************************/
--- /dev/null
+# gpsbabel XCSV style file
+#
+# Format: GPSMAN Format
+# Author: Alex Mottram
+# Date: 12/09/2002
+#
+#
+# As defined in gpsman.c
+#
+#
+
+DESCRIPTION GPSman
+SHORTLEN 8
+SHORTWHITE 0
+
+# FILE LAYOUT DEFINITIIONS:
+#
+FIELD_DELIMITER TAB
+RECORD_DELIMITER NEWLINE
+BADCHARS TAB
+
+PROLOGUE !Format: DDD 1 WGS 84
+PROLOGUE !W:
+
+#
+# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
+#
+IFIELD SHORTNAME, "", "%-8.8s"
+IFIELD DESCRIPTION, "", "%s"
+IFIELD LAT_DIRDECIMAL, "", "%c%f"
+IFIELD LON_DIRDECIMAL, "", "%c%f"
+IFIELD IGNORE, "", "%s"
+
+# gpsman.c likes mkshort len = 8, whitespace = 0.
--- /dev/null
+/*
+ Access gpsutil files.
+
+ Copyright (C) 2002, 2003, 2004 Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+
+#include "defs.h"
+#include "cet_util.h"
+#include "magellan.h"
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+
+static gbfile* file_in, *file_out;
+static short_handle mkshort_handle;
+
+#define MYNAME "GPSUTIL"
+
+static void
+rd_init(const QString& fname)
+{
+ file_in = gbfopen(fname, "rb", MYNAME);
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(file_in);
+}
+
+static void
+wr_init(const QString& fname)
+{
+ file_out = gbfopen(fname, "w", MYNAME);
+ mkshort_handle = mkshort_new_handle();
+}
+
+static void
+wr_deinit()
+{
+ gbfclose(file_out);
+ mkshort_del_handle(&mkshort_handle);
+}
+
+static void
+data_read()
+{
+ char* ibuf;
+ char desc[31];
+ double lat,lon;
+ char latdir, londir;
+ long alt;
+ char alttype;
+ char icon[3];
+ int line = 0;
+ /*
+ * Make sure that all waypoints in single read have same
+ * timestamp.
+ */
+ time_t now = current_time().toTime_t();
+ icon[0] = 0;
+
+ while ((ibuf = gbfgetstr(file_in))) {
+ char* sn;
+
+ if ((line++ == 0) && file_in->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+
+ /* A sharp in column zero or an blank line is a comment */
+ ibuf = lrtrim(ibuf);
+ int len = strlen(ibuf);
+ if ((len == 0) || (*ibuf == '#')) {
+ continue;
+ }
+
+ if (len > 71) {
+ int offs = len - 71;
+ sn = xstrndup(ibuf, offs + 8);
+ ibuf += (offs + 9);
+ } else {
+ sn = xstrndup(ibuf, 8);
+ ibuf += 9;
+ }
+
+ int n = sscanf(ibuf, "%lf%c %lf%c %ld%c %30[^,] %2s",
+ &lat, &latdir, &lon, &londir,
+ &alt, &alttype, desc, icon);
+ /* Require at least first three fields, otherwise ignore */
+ if (n < 2) {
+ xfree(sn);
+ continue;
+ }
+ rtrim(sn);
+ rtrim(desc);
+ rtrim(icon);
+ auto* wpt_tmp = new Waypoint;
+ wpt_tmp->altitude = alt;
+ wpt_tmp->shortname = sn;
+ xfree(sn);
+ wpt_tmp->description = desc;
+ wpt_tmp->SetCreationTime(now);
+
+ if (latdir == 'S') {
+ lat = -lat;
+ }
+ if (londir == 'W') {
+ lon = -lon;
+ }
+
+ lat /= 100.0;
+ lon /= 100.0;
+ int ilon = (int)(lon);
+ wpt_tmp->longitude = ilon + (lon - ilon)*(100.0/60.0);
+ int ilat = (int)(lat);
+ wpt_tmp->latitude = ilat + (lat - ilat) * (100.0/60.0);
+ wpt_tmp->icon_descr = mag_find_descr_from_token(icon);
+ waypt_add(wpt_tmp);
+ }
+}
+
+static void
+gpsutil_disp(const Waypoint* wpt)
+{
+ char* tdesc = xstrdup(wpt->description);
+
+ QString icon_token = mag_find_token_from_descr(wpt->icon_descr);
+
+ double lon = degrees2ddmm(wpt->longitude);
+ double lat = degrees2ddmm(wpt->latitude);
+
+ gbfprintf(file_out, "%-8.8s %08.3f%c %09.3f%c %07.0f%c %-30.30s %s\n",
+ global_opts.synthesize_shortnames ?
+ CSTRc(mkshort_from_wpt(mkshort_handle, wpt)) :
+ CSTRc(wpt->shortname),
+ fabs(lat),
+ lat < 0.0 ? 'S' : 'N',
+ fabs(lon),
+ lon < 0.0 ? 'W' : 'E',
+ ((wpt->altitude == unknown_alt) ||
+ (wpt->altitude < 0.0)) ? 0 : wpt->altitude,
+ 'm',
+ CSTRc(wpt->description) ? tdesc : "",
+ CSTR(icon_token));
+
+ xfree(tdesc);
+}
+
+static void
+data_write()
+{
+ waypt_disp_all(gpsutil_disp);
+}
+
+
+ff_vecs_t gpsutil_vecs = {
+ ff_type_file,
+ FF_CAP_RW_WPT,
+ rd_init,
+ wr_init,
+ rd_deinit,
+ wr_deinit,
+ data_read,
+ data_write,
+ nullptr,
+ nullptr,
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+
+ Support for XML files from jogmap.de
+
+ Copyright (C) 2009 Robert Lipe robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+
+#include "defs.h"
+#include "garmin_tables.h"
+#include "jeeps/gpsmath.h"
+#include "xmlgeneric.h"
+#include <QXmlStreamAttributes>
+
+static route_head* trk;
+
+static QVector<arglist_t> jogmap_args = {
+};
+
+#define MYNAME "xol"
+
+// static xg_callback jogmap_shape, xol_shape_end;
+// static xg_callback jogmap_waypt, xol_overlay;
+
+#define XOL "/overlays/overlay"
+
+
+
+static void
+jogmap_markers(xg_string, const QXmlStreamAttributes*)
+{
+ trk = new route_head;
+ track_add_head(trk);
+}
+
+static void
+jogmap_marker(xg_string, const QXmlStreamAttributes* attrv)
+{
+ auto* wpt = new Waypoint;
+
+ if (attrv->hasAttribute("lat")) {
+ wpt->latitude = attrv->value("lat").toString().toDouble();
+ }
+
+ if (attrv->hasAttribute("lng")) {
+ wpt->longitude = attrv->value("lng").toString().toDouble();
+ }
+
+ if (trk) {
+ track_add_wpt(trk, wpt);
+ }
+}
+
+static
+xg_tag_mapping jogmap_map[] = {
+ { jogmap_markers, cb_start, "/markers" },
+ { jogmap_marker, cb_start, "/markers/marker" },
+ { nullptr, (xg_cb_type)0, nullptr }
+};
+
+static void
+jogmap_rd_init(const QString& fname)
+{
+ trk = nullptr;
+ xml_init(fname, jogmap_map, nullptr);
+}
+
+static void
+jogmap_read()
+{
+ xml_read();
+}
+
+static void
+jogmap_rd_deinit()
+{
+ xml_deinit();
+}
+
+ff_vecs_t jogmap_vecs = {
+ ff_type_file,
+ {
+ ff_cap_none, /* waypoints */
+ ff_cap_read, /* tracks */
+ ff_cap_none
+ }, /* routes */
+ jogmap_rd_init,
+ nullptr,
+ jogmap_rd_deinit,
+ nullptr,
+ jogmap_read,
+ nullptr,
+ nullptr,
+ &jogmap_args,
+ CET_CHARSET_UTF8, 0
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+
+ Support for the Jelbert GeoTagger JTR data file format.
+
+ Copyright (C) 2008 Olaf Klein, o.b.klein@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+#include "defs.h"
+#include "csv_util.h"
+#include <QHash>
+//#include <cassert>
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+#include "nmea.h"
+
+#define MYNAME "jtr"
+
+static
+QVector<arglist_t> jtr_args = {
+};
+
+static gbfile* fin, *fout;
+static QHash<QString, const Waypoint*> trkpts;
+
+void
+jtr_parse_date(const char* str, QDate& date)
+{
+ int dmy = atoi(str);
+ if (dmy > 0) {
+ int year= dmy % 100 + 2000;
+ dmy = dmy / 100;
+ int month = dmy % 100;
+ dmy = dmy / 100;
+ int day = dmy;
+ date = QDate(year, month, day);
+ }
+}
+
+void
+jtr_parse_time(const char* str, QTime& time)
+{
+ char* dot;
+ long int hms = strtol(str, &dot, 10);
+ int sec = hms % 100;
+ hms = hms / 100;
+ int min = hms % 100;
+ hms = hms / 100;
+ int hour = hms % 100;
+
+ if (*dot == '.') {
+ int milli = atoi(dot + 1) * 10;
+ sec += milli / 1000;
+ }
+
+ time = QTime(hour, min, sec);
+}
+
+/*******************************************************************************
+* %%% global callbacks called by gpsbabel main process %%% *
+*******************************************************************************/
+
+static void
+jtr_rd_init(const QString& fname)
+{
+ fin = gbfopen(fname, "r", MYNAME);
+}
+
+static void
+jtr_rd_deinit()
+{
+ trkpts.clear();
+ gbfclose(fin);
+}
+
+static void
+jtr_read()
+{
+ char* str;
+ int line = 0;
+ route_head* trk = nullptr;
+
+ while ((str = gbfgetstr(fin))) {
+ QDate date;
+ QTime time;
+ char valid = 'V';
+ double lon;
+ float course, mcourse, mvar, mdev;
+ char mdevdir;
+
+ line++;
+
+ str = lrtrim(str);
+ if (*str == '\0') {
+ continue;
+ }
+
+ if (strncmp(str, "GEOTAG2,", 8) != 0) {
+ fatal(MYNAME ": Unknown or unsupported file (missing \"GEOTAG2\")!\n");
+ }
+
+ double lat = lon = 999;
+ float speed = course = mcourse = mvar = mdev = -1;
+ char mvardir = mdevdir = 0;
+
+ int column = -1;
+ char* tmp = str;
+ while ((str = csv_lineparse(tmp, ",", "", column++))) {
+ tmp = nullptr;
+
+ if (*str == '\0') {
+ continue;
+ }
+
+ switch (column) {
+ case 0:
+ break; /* GEOTAG2 */
+ case 1:
+ jtr_parse_time(str, time);
+ break;
+ case 2:
+ valid = *str;
+ break;
+ case 3:
+ lat = ddmm2degrees(atof(str));
+ break;
+ case 4:
+ if (*str == 'S') {
+ lat *= -1;
+ }
+ break;
+ case 5:
+ lon = ddmm2degrees(atof(str));
+ break;
+ case 6:
+ if (*str == 'W') {
+ lon *= -1;
+ }
+ break;
+ case 7:
+ speed = KNOTS_TO_MPS(atof(str));
+ break;
+ case 8:
+ course = atof(str);
+ break;
+ case 9:
+ jtr_parse_date(str, date);
+ break;
+ case 13:
+ mcourse = atof(str);
+ break;
+ case 14:
+ mdev = atof(str);
+ break;
+ case 15:
+ mdevdir = *str;
+ break;
+ case 16:
+ mvar = atof(str);
+ break;
+ case 17:
+ mvardir = *str;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if ((lat == 999) || (lon == 999) || (valid != 'A')) {
+ continue;
+ }
+
+ QDateTime dt = QDateTime(date, time, Qt::UTC);
+
+ /* check for duplicates as suggested in format description */
+ QString buf = QString("%1\01%2\01%3")
+ .arg(QString::number(lat, 'f', 6),
+ QString::number(lon, 'f', 6),
+ QString::number(dt.toSecsSinceEpoch()));
+ if (trkpts.contains(buf)) {
+ continue;
+ }
+
+ auto* wpt = new Waypoint;
+
+ wpt->latitude = lat;
+ wpt->longitude = lon;
+ wpt->SetCreationTime(dt);
+ if (speed >= 0) {
+ WAYPT_SET(wpt, speed, speed);
+ }
+ if (mcourse >= 0) {
+ course = mcourse;
+ if (mvar >= 0) {
+ if (mvardir == 'W') {
+ course += mvar;
+ } else if (mvardir == 'E') {
+ course -= mvar;
+ }
+ }
+ if (mdev >= 0) {
+ if (mdevdir == 'W') {
+ course += mdev;
+ } else if (mdevdir == 'E') {
+ course -= mdev;
+ }
+ }
+ }
+ if (course >= 0) {
+ WAYPT_SET(wpt, course, course);
+ }
+
+ if (trk == nullptr) {
+ trk = new route_head;
+ track_add_head(trk);
+ }
+
+ trkpts.insert(buf, wpt);
+ track_add_wpt(trk, wpt);
+ }
+}
+
+static void
+jtr_wr_init(const QString& fname)
+{
+ fout = gbfopen(fname, "wb", MYNAME);
+}
+
+static void
+jtr_wr_deinit()
+{
+ gbfclose(fout);
+}
+
+static void
+jtr_trkpt_disp_cb(const Waypoint* wpt)
+{
+ char* str, *tmp;
+ char scourse[6], sspeed[8];
+ QString sdate;
+ QString stime;
+
+ if (wpt->creation_time.isValid()) {
+ gpsbabel::DateTime dt = wpt->GetCreationTime().toUTC();
+
+ // round time to centiseconds.
+ int msec = dt.time().msec();
+ int csec = lround(msec/10.0);
+ dt = dt.addMSecs(csec*10-msec);
+ sdate = dt.toString(QStringLiteral("ddMMyy"));
+ stime = dt.toString(QStringLiteral("HHmmss.zzz"));
+ // toss milliseconds position which should now be zero.
+ //assert(stime.endsWith('0'));
+ stime.chop(1);
+ // suppress fractional seconds if they are zero.
+ stime = stime.replace(QLatin1String(".00"), QLatin1String(""));
+ }
+ if (WAYPT_HAS(wpt, speed) && (wpt->speed >= 0)) {
+ snprintf(sspeed, sizeof(sspeed), "%.1f", MPS_TO_KNOTS(wpt->speed));
+ } else {
+ sspeed[0] = 0;
+ }
+ if (WAYPT_HAS(wpt, course) && (wpt->course >= 0)) {
+ snprintf(scourse, sizeof(scourse), "%.1f", wpt->course);
+ } else {
+ scourse[0] = 0;
+ }
+
+ xasprintf(&str, "GEOTAG2,%s,%c,%09.4f,%c,%010.4f,%c,%s,%s,%s,,E,A",
+ CSTR(stime),
+ wpt->creation_time.isValid() ? 'A' : 'V',
+ fabs(degrees2ddmm(wpt->latitude)),
+ wpt->latitude < 0 ? 'S' : 'N',
+ fabs(degrees2ddmm(wpt->longitude)),
+ wpt->longitude < 0 ? 'W' : 'E',
+ sspeed,
+ scourse,
+ CSTR(sdate));
+
+ xasprintf(&tmp, "%s*%02X", str, NmeaFormat::nmea_cksum(str));
+ xfree(str);
+ str = tmp;
+
+ xasprintf(&tmp, "%s,,,E,,E*%02X\r", str, NmeaFormat::nmea_cksum(str));
+ xfree(str);
+ str = tmp;
+
+ gbfputs(str, fout);
+ xfree(str);
+}
+
+static void
+jtr_write()
+{
+ track_disp_all(nullptr, nullptr, jtr_trkpt_disp_cb);
+}
+
+/**************************************************************************/
+
+ff_vecs_t jtr_vecs = {
+ ff_type_file,
+ {
+ ff_cap_none, /* waypoints */
+ (ff_cap)(ff_cap_read | ff_cap_write), /* tracks */
+ ff_cap_none /* routes */
+ },
+ jtr_rd_init,
+ jtr_wr_init,
+ jtr_rd_deinit,
+ jtr_wr_deinit,
+ jtr_read,
+ jtr_write,
+ nullptr,
+ &jtr_args,
+ CET_CHARSET_ASCII, 0 /* ascii is the expected character set */
+ /* not fixed, can be changed through command line parameter */
+ , NULL_POS_OPS,
+ nullptr
+};
+
+/**************************************************************************/
--- /dev/null
+/*
+ Magellan ".gs" files as they appear on USB of Explorist 400,500,600.
+
+ Copyright (C) 2005, 2006, 2008 robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include "defs.h"
+#include "csv_util.h"
+#include "magellan.h"
+#include <QXmlStreamAttributes>
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+
+#define MYNAME "maggeo"
+
+/* Turn this on (remove) after 5.2 becomes widespread. */
+#define FIRMWARE_DOES_88591 0
+
+static gbfile* maggeofile_in;
+static gbfile* maggeofile_out;
+static short_handle desc_handle = nullptr;
+
+static QDateTime maggeo_parsedate(char* dmy);
+
+static void
+maggeo_writemsg(const char* const buf)
+{
+ unsigned int osum = mag_checksum(buf);
+ gbfprintf(maggeofile_out, "$%s*%02X\r\n",buf, osum);
+}
+
+static void
+maggeo_rd_init(const QString& fname)
+{
+ maggeofile_in = gbfopen(fname, "rb", MYNAME);
+}
+
+static void
+maggeo_rd_deinit()
+{
+ gbfclose(maggeofile_in);
+}
+
+static void
+maggeo_wr_init(const QString& fname)
+{
+ if (waypt_count() > 200) {
+ fatal(MYNAME ": eXplorist does not support more than 200 waypoints in one .gs file.\nDecrease the number of waypoints sent.\n");
+ }
+ maggeofile_out = gbfopen(fname, "wb", MYNAME);
+ desc_handle = mkshort_new_handle();
+ setshort_length(desc_handle, 20);
+ setshort_badchars(desc_handle, "\"$,");
+}
+
+static void
+maggeo_wr_deinit()
+{
+ maggeo_writemsg("PMGNCMD,END");
+ mkshort_del_handle(&desc_handle);
+ gbfclose(maggeofile_out);
+}
+
+static void
+maggeo_read()
+{
+ char* buff;
+
+ while ((buff = gbfgetstr(maggeofile_in))) {
+ char* s = nullptr;
+
+ buff = lrtrim(buff);
+ if (*buff == '\0') {
+ continue;
+ }
+ if (strncmp(buff, "$PMGNGEO,", 9)) {
+ continue;
+ }
+
+ buff += 9; /* skip field no. 1 */
+ int fld = 1;
+
+ auto* wpt_tmp = new Waypoint;
+ geocache_data* gcdata = wpt_tmp->AllocGCData();
+
+ while ((s = csv_lineparse(buff, ",", "", fld++))) {
+ buff = nullptr;
+
+ s = lrtrim(s);
+ if (*s == '\0') {
+ continue;
+ }
+
+ switch (fld) {
+ case 2:
+ wpt_tmp->latitude = ddmm2degrees(atof(s));
+ break;
+ case 3:
+ if (s[0] == 'S') {
+ wpt_tmp->latitude = -wpt_tmp->latitude;
+ }
+ break;
+ case 4:
+ wpt_tmp->longitude = ddmm2degrees(atof(s));
+ break;
+ case 5:
+ if (s[0] == 'W') {
+ wpt_tmp->longitude = -wpt_tmp->longitude;
+ }
+ break;
+ case 6:
+ wpt_tmp->altitude = atof(s);
+ break;
+ case 7:
+ if (s[0] == 'F') {
+ wpt_tmp->altitude = METERS_TO_FEET(wpt_tmp->altitude);
+ }
+ break;
+ case 8:
+ wpt_tmp->shortname = s;
+ break;
+ case 9:
+ wpt_tmp->description = s;
+ break;
+ case 10:
+ gcdata->placer = s;
+ break;
+ case 11:
+ gcdata->hint = s;
+ break;
+ case 12: // cache type
+ if (strcmp(s, "Mystery Cache") == 0) {
+ gcdata->type = gt_surprise;
+ } else {
+ gcdata->type = gs_mktype(s);
+ }
+ break;
+ case 13:
+ wpt_tmp->creation_time = maggeo_parsedate(s);
+ break;
+ case 14: // last found date was ignored. Implemented 2013-02-27.
+ gcdata->last_found = maggeo_parsedate(s);
+ break;
+ case 15:
+ gcdata->diff = 10 * atof(s);
+ break;
+ case 16:
+ gcdata->terr = 10 * atof(s);
+ break;
+ }
+ }
+ waypt_add(wpt_tmp);
+ }
+
+}
+
+static
+QString
+maggeo_fmtdate(const QDateTime& dt)
+{
+ QDate date = dt.date();
+ int y = date.year() - 1900;
+ int m = date.month();
+ int d = date.day();
+ int r = d * 100000 + m * 1000 + y;
+ return QString("%1").arg(r, 7, 10, QChar('0'));
+}
+
+/*
+ * The maggeo date format s DDMMYYY where "YYY" is the number
+ * of years since 1900. This, of course, means anything in this
+ * century is three digits but anything from before 2000, we'd have
+ * two digit years. This makes this easier to parse as strings.
+ */
+static QDateTime maggeo_parsedate(char* dmy)
+{
+ QString date(dmy);
+ int d = date.mid(0,2).toInt();
+ int m = date.mid(2,2).toInt();
+ int y = date.mid(4,3).toInt();
+#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
+ QDateTime r(QDate(y + 1900, m, d));
+#else
+ QDateTime r = QDate(y + 1900, m, d).startOfDay();
+#endif
+ return r;
+}
+
+/*
+ * Append an optional UTF string to buf, prepending a comma,
+ * cleansing it of NMEA-isms and decomposing to ASCII as we go.
+ */
+static
+void
+append(char* buf, const char* str)
+{
+ char* cleansed2;
+
+ strcat(buf, ",");
+
+ if (!str) {
+ return;
+ }
+
+ char* cleansed1 = xstrdup(str);
+#if FIRMWARE_DOES_88591
+ /* Actually, this function needs needs refactored... */
+ cleansed2 = xstrdup(cleansed1);
+#else
+ cleansed2 = xstrdup(m330_cleanse(cleansed1));
+#endif
+
+ strcat(buf, cleansed2);
+
+
+ xfree(cleansed1);
+ xfree(cleansed2);
+
+}
+
+static void
+maggeo_waypt_pr(const Waypoint* waypointp)
+{
+ char obuf[4096];
+ const char* ctype = nullptr;
+
+ double ilat = waypointp->latitude;
+ double ilon = waypointp->longitude;
+
+ double lon = fabs(ilon);
+ double lat = fabs(ilat);
+
+ int lon_deg = lon;
+ int lat_deg = lat;
+
+ lon = (lon - lon_deg) * 60.0;
+ lat = (lat - lat_deg) * 60.0;
+
+ lon = (lon_deg * 100.0 + lon);
+ lat = (lat_deg * 100.0 + lat);
+
+ /*
+ * For some reason, Magellan used exactly the GPX spellings of
+ * everything except this one...
+ */
+ if (waypointp->gc_data->type == gt_surprise) {
+ ctype = "Mystery Cache";
+ } else {
+ ctype = gs_get_cachetype(waypointp->gc_data->type);
+ }
+ QString placeddate = maggeo_fmtdate(waypointp->creation_time);
+ QString lfounddate = maggeo_fmtdate(waypointp->gc_data->last_found);
+ QString cname = mkshort(desc_handle,
+ waypointp->notes.isEmpty() ? waypointp->description : waypointp->notes);
+ QString placer = waypointp->gc_data->placer;
+
+ /*
+ * As of this writing on 05/04, the firmware in the units will
+ * let you write fields of just about any width, but appears to
+ * only use the following:
+ * shortname - 8 chars
+ * cname - 20 chars (scrolls in some places, not others)
+ * placer - display limited by width
+ * hint - 50 chars
+ * cache type - appears to be parsed by f/w for icon matching.
+ *
+ *
+ */
+ snprintf(obuf, sizeof(obuf),
+ "PMGNGEO,%4.3f,%c,%08.3f,%c,%04.0f,F",
+ lat, ilat < 0 ? 'S' : 'N',
+ lon, ilon < 0 ? 'W' : 'E',
+ waypointp->altitude == unknown_alt ?
+ 0 : waypointp->altitude);
+ append(obuf, CSTRc(waypointp->shortname));
+ append(obuf, CSTR(cname));
+ append(obuf, CSTR(placer));
+ append(obuf, CSTR(waypointp->gc_data->hint));
+ append(obuf, ctype);
+ append(obuf, placeddate.toUtf8());
+ append(obuf, lfounddate.toUtf8());
+
+ if (waypointp->gc_data->diff/10.0)
+ sprintf(obuf + strlen(obuf), ",%3.1f",
+ waypointp->gc_data->diff/10.0);
+ else {
+ strcat(obuf, ",");
+ }
+
+ if (waypointp->gc_data->terr/10.0)
+ sprintf(obuf + strlen(obuf), ",%3.1f",
+ waypointp->gc_data->terr/10.0);
+ else {
+ strcat(obuf, ",");
+ }
+
+ maggeo_writemsg(obuf);
+}
+
+static void
+maggeo_write()
+{
+ waypt_disp_all(maggeo_waypt_pr);
+}
+
+ff_vecs_t maggeo_vecs = {
+ ff_type_file,
+ { (ff_cap)(ff_cap_read | ff_cap_write), ff_cap_none, ff_cap_none },
+ maggeo_rd_init,
+ maggeo_wr_init,
+ maggeo_rd_deinit,
+ maggeo_wr_deinit,
+ maggeo_read,
+ maggeo_write,
+ nullptr,
+ nullptr,
+#if FIRMWARE_DOES_88591
+ CET_CHARSET_LATIN1, 0 /* CET-REVIEW */
+#else
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+#endif
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ Access Magellan Mapsend files.
+
+ Copyright (C) 2002-2006 Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <cmath> // for lround
+#include <cstdio> // for sprintf
+#include <cstdlib> // for atoi
+#include <cstring> // for strncpy
+#include <ctime>
+
+#include <QString> // for QString
+#include <QTime> // for QTime
+#include <QtGlobal> // for Q_UNUSED
+
+#include "defs.h"
+#include "mapsend.h"
+#include "gbfile.h" // for gbfputint32, gbfgetint32, gbfgetdbl, gbfputdbl, gbfgetpstr, gbfwrite, gbfputpstr, gbfputc, gbfread, gbfclose, gbfgetc, gbfgetflt, gbfopen, gbfputflt, gbfile, gbfgetuint32, gbfopen_le, gbsize_t
+#include "magellan.h" // for mag_find_token_from_descr, mag_find_descr_from_token
+#include "src/core/datetime.h" // for DateTime
+
+
+static gbfile* mapsend_file_in;
+static gbfile* mapsend_file_out;
+static short_handle mkshort_handle;
+static short_handle wpt_handle;
+
+static int route_wp_count;
+static int mapsend_infile_version;
+static int trk_version = 30;
+
+#define MYNAME "mapsend"
+
+static char* mapsend_opt_trkver = nullptr;
+#define MAPSEND_TRKVER_MIN 3
+#define MAPSEND_TRKVER_MAX 4
+
+static
+QVector<arglist_t> mapsend_args = {
+ {
+ "trkver", &mapsend_opt_trkver,
+ "MapSend version TRK file to generate (3,4)",
+ "4", ARGTYPE_INT, "3", "4", nullptr
+ },
+};
+
+static void
+mapsend_init_opts(const char isReading) /* 1=read, 2=write */
+{
+ /* read & write options here */
+
+ if (isReading) {
+ /* reading-only options here */
+ } else {
+ /* writing-only options here */
+
+ // TRK MapSend version
+ int opt_trkver = atoi(mapsend_opt_trkver);
+ if ((opt_trkver < MAPSEND_TRKVER_MIN) || (opt_trkver > MAPSEND_TRKVER_MAX)) {
+ fatal(MYNAME ": Unsupported MapSend TRK version \"%s\"!\n", mapsend_opt_trkver);
+ }
+ trk_version = opt_trkver * 10;
+ }
+}
+
+static void
+mapsend_rd_init(const QString& fname)
+{
+ mapsend_init_opts(1);
+ mapsend_file_in = gbfopen_le(fname, "rb", MYNAME);
+}
+
+static void
+mapsend_rd_deinit()
+{
+ gbfclose(mapsend_file_in);
+}
+
+static void
+mapsend_wr_init(const QString& fname)
+{
+ mapsend_init_opts(0);
+ mapsend_file_out = gbfopen(fname, "wb", MYNAME);
+ mkshort_handle = mkshort_new_handle();
+
+ wpt_handle = mkshort_new_handle();
+ setshort_whitespace_ok(wpt_handle, 1);
+ setshort_length(wpt_handle, 8);
+
+ route_wp_count = 0;
+}
+
+static void
+mapsend_wr_deinit()
+{
+ gbfclose(mapsend_file_out);
+ mkshort_del_handle(&mkshort_handle);
+ mkshort_del_handle(&wpt_handle);
+}
+
+static void
+mapsend_wpt_read()
+{
+ char tbuf[256];
+ char wpt_icon;
+ Waypoint* wpt_tmp;
+
+ int wpt_count = gbfgetint32(mapsend_file_in);
+
+ while (wpt_count--) {
+ wpt_tmp = new Waypoint;
+
+ wpt_tmp->shortname = gbfgetpstr(mapsend_file_in);
+ wpt_tmp->description = gbfgetpstr(mapsend_file_in);
+
+ int wpt_number = gbfgetint32(mapsend_file_in);
+ (void) wpt_number; // hush warning.
+ wpt_icon = gbfgetc(mapsend_file_in);
+ char wpt_status = gbfgetc(mapsend_file_in);
+ (void) wpt_status; // hush warning.
+
+ wpt_tmp->altitude = gbfgetdbl(mapsend_file_in);
+ wpt_tmp->longitude = gbfgetdbl(mapsend_file_in);
+ wpt_tmp->latitude = -gbfgetdbl(mapsend_file_in);
+
+ if (wpt_icon < 26) {
+ sprintf(tbuf, "%c", wpt_icon + 'a');
+ } else {
+ sprintf(tbuf, "a%c", wpt_icon - 26 + 'a');
+ }
+ wpt_tmp->icon_descr = mag_find_descr_from_token(tbuf);
+
+ waypt_add(wpt_tmp);
+ }
+
+ /* now read the routes... */
+ int rte_count = gbfgetint32(mapsend_file_in);
+
+ while (rte_count--) {
+ auto* rte_head = new route_head;
+ route_add_head(rte_head);
+
+ /* route name */
+ rte_head->rte_name = gbfgetpstr(mapsend_file_in);
+
+ /* route # */
+ int rte_num = gbfgetint32(mapsend_file_in);
+ rte_head->rte_num = rte_num;
+
+ /* points this route */
+ wpt_count = gbfgetint32(mapsend_file_in);
+
+ while (wpt_count--) {
+ wpt_tmp = new Waypoint;
+
+ /* waypoint name */
+ wpt_tmp->shortname = gbfgetpstr(mapsend_file_in);
+
+ /* waypoint # */
+ int wpt_number = gbfgetint32(mapsend_file_in);
+ Q_UNUSED(wpt_number)
+ wpt_tmp->longitude = gbfgetdbl(mapsend_file_in);
+ wpt_tmp->latitude = -gbfgetdbl(mapsend_file_in);
+
+ gbfread(&wpt_icon, 1, sizeof(wpt_icon), mapsend_file_in);
+
+ if (wpt_icon < 26) {
+ sprintf(tbuf, "%c", wpt_icon + 'a');
+ } else {
+ sprintf(tbuf, "a%c", wpt_icon - 26 + 'a');
+ }
+ wpt_tmp->icon_descr = mag_find_descr_from_token(tbuf);
+
+ route_add_wpt(rte_head, wpt_tmp);
+ }
+ }
+}
+
+static void
+mapsend_track_read()
+{
+ auto* track_head = new route_head;
+ track_head->rte_name = gbfgetpstr(mapsend_file_in);
+ track_add_head(track_head);
+
+ unsigned int trk_count = gbfgetuint32(mapsend_file_in);
+
+ while (trk_count--) {
+ auto* wpt_tmp = new Waypoint;
+
+ wpt_tmp->longitude = gbfgetdbl(mapsend_file_in);
+ wpt_tmp->latitude = -gbfgetdbl(mapsend_file_in);
+
+ if (mapsend_infile_version < 36) { /* < version 4.0 */
+ wpt_tmp->altitude = gbfgetint32(mapsend_file_in);
+ } else {
+ wpt_tmp->altitude = gbfgetflt(mapsend_file_in);
+ }
+ if (wpt_tmp->altitude < unknown_alt + 1) {
+ wpt_tmp->altitude = unknown_alt;
+ }
+ time_t t = gbfgetint32(mapsend_file_in);
+ int32_t valid = gbfgetint32(mapsend_file_in);
+ Q_UNUSED(valid);
+
+ /* centiseconds only in >= version 3.0 */
+ unsigned char centisecs;
+ if (mapsend_infile_version >= 34) {
+ gbfread(¢isecs, 1, 1, mapsend_file_in);
+ } else {
+ centisecs = 0;
+ }
+ wpt_tmp->SetCreationTime(t, 10 * centisecs);
+
+ track_add_wpt(track_head, wpt_tmp);
+ }
+}
+
+static void
+mapsend_read()
+{
+ mapsend_hdr hdr;
+ char buf[3];
+
+ /*
+ * Because of the silly struct packing and the goofy variable-length
+ * strings, each member has to be read in one at a time. Grrr.
+ */
+
+ gbsize_t len = gbfread(&hdr, 1, sizeof(hdr), mapsend_file_in);
+ is_fatal(len < sizeof(hdr), MYNAME ": No mapsend or empty file!");
+
+ int type = le_read16(&hdr.ms_type);
+ strncpy(buf, hdr.ms_version, 2);
+ buf[2] = '\0';
+
+ mapsend_infile_version = atoi(buf);
+
+ switch (type) {
+ case ms_type_wpt:
+ mapsend_wpt_read();
+ break;
+ case ms_type_track:
+ mapsend_track_read();
+ break;
+ case ms_type_log:
+ fatal(MYNAME ", GPS logs not supported.\n");
+ case ms_type_rgn:
+ fatal(MYNAME ", GPS regions not supported.\n");
+ default:
+ fatal(MYNAME ", unknown file type %d\n", type);
+ }
+}
+
+
+static void
+mapsend_waypt_pr(const Waypoint* waypointp)
+{
+ static int cnt = 0;
+ QString sn = global_opts.synthesize_shortnames ?
+ mkshort_from_wpt(mkshort_handle, waypointp) :
+ waypointp->shortname;
+
+ /*
+ * The format spec doesn't call out the character set of waypoint
+ * name and description. Empirically, we can see that it's 8859-1,
+ * but if we create mapsend files containing those, Mapsend becomes
+ * grumpy uploading the resulting waypoints and being unable to deal
+ * with the resulting comm errors.
+ *
+ * Ironically, our own Magellan serial module strips the "naughty"
+ * characters, keeping it more in definition with their own serial
+ * spec. :-)
+ *
+ * So we just decompose the utf8 strings to ascii before stuffing
+ * them into the Mapsend file.
+ */
+
+
+ QString tmp1 = mkshort(wpt_handle, sn);
+ gbfputpstr(tmp1, mapsend_file_out);
+
+ // This is funny looking to ensure that no more than 30 bytes
+ // get written to the file.
+ unsigned int c = waypointp->description.length();
+ if (c > 30) {
+ c = 30;
+ }
+ gbfputc(c, mapsend_file_out);
+ gbfwrite(CSTR(waypointp->description), 1, c, mapsend_file_out);
+
+ /* #, icon, status */
+ gbfputint32(++cnt, mapsend_file_out);
+
+
+ QString iconp;
+ if (!waypointp->icon_descr.isNull()) {
+ iconp = mag_find_token_from_descr(waypointp->icon_descr);
+ if (1 == iconp.size()) {
+ c = iconp[0].toLatin1() - 'a';
+ } else {
+ c = iconp[1].toLatin1() - 'a' + 26;
+ }
+ } else {
+ c = 0;
+ }
+ if (get_cache_icon(waypointp)) {
+ iconp = mag_find_token_from_descr(get_cache_icon(waypointp));
+ if (1 == iconp.size()) {
+ c = iconp[0].toLatin1() - 'a';
+ } else {
+ c = iconp[1].toLatin1() - 'a' + 26;
+ }
+ }
+
+ gbfputc(c, mapsend_file_out);
+ gbfputc(1, mapsend_file_out);
+
+ double falt = waypointp->altitude;
+ if (falt == unknown_alt) {
+ falt = 0;
+ }
+ gbfputdbl(falt, mapsend_file_out);
+
+ gbfputdbl(waypointp->longitude, mapsend_file_out);
+ gbfputdbl(-waypointp->latitude, mapsend_file_out);
+}
+
+static void
+mapsend_route_hdr(const route_head* rte)
+{
+ QString rname;
+ QString r = rte->rte_name;
+
+ /* route name -- mapsend really seems to want something here.. */
+ if (r.isEmpty()) {
+ rname = "Route";
+ } else {
+ rname = CSTRc(rte->rte_name);
+ }
+ gbfputpstr(rname, mapsend_file_out);
+
+ /* route # */
+ gbfputint32(rte->rte_num, mapsend_file_out);
+
+ /* # of waypoints to follow... */
+ gbfputint32(rte->rte_waypt_ct(), mapsend_file_out);
+}
+
+static void
+mapsend_route_disp(const Waypoint* waypointp)
+{
+ unsigned char c;
+
+ route_wp_count++;
+
+ /* waypoint name */
+ gbfputpstr(waypointp->shortname, mapsend_file_out);
+
+ /* waypoint number */
+ gbfputint32(route_wp_count, mapsend_file_out);
+
+ gbfputdbl(waypointp->longitude, mapsend_file_out);
+ gbfputdbl(-waypointp->latitude, mapsend_file_out);
+
+ if (!waypointp->icon_descr.isNull()) {
+ QString iconp = mag_find_token_from_descr(waypointp->icon_descr);
+ if (1 == iconp.size()) {
+ c = iconp[0].toLatin1() - 'a';
+ } else {
+ c = iconp[1].toLatin1() - 'a' + 26;
+ }
+ } else {
+ c = 0;
+ }
+ gbfwrite(&c, 1, 1, mapsend_file_out);
+}
+
+static void mapsend_track_hdr(const route_head* trk)
+{
+ /*
+ * we write mapsend v3.0 tracks as mapsend v2.0 tracks get
+ * tremendously out of whack time/date wise.
+ */
+ const char* verstring = "30";
+ mapsend_hdr hdr = {13, {'4','D','5','3','3','3','3','4',' ','M','S'},
+ {'3','0'}, ms_type_track, {0, 0, 0}
+ };
+
+ switch (trk_version) {
+ case 20:
+ verstring = "30";
+ break;
+ case 30:
+ verstring = "34";
+ break;
+ case 40:
+ /* the signature seems to change with the versions, even though it
+ * shouldn't have according to the document. MapSend V4 doesn't
+ * like the old version.
+ */
+ hdr.ms_signature[7] = '6';
+ verstring = "36";
+ break;
+ default:
+ fatal("Unknown track version.\n");
+ break;
+ }
+
+ hdr.ms_version[0] = verstring[0];
+ hdr.ms_version[1] = verstring[1];
+
+ gbfwrite(&hdr, sizeof(hdr), 1, mapsend_file_out);
+ QString tname = trk->rte_name.isEmpty() ? "Track" : trk->rte_name;
+ gbfputpstr(tname, mapsend_file_out);
+
+ /* total nodes (waypoints) this track */
+ int i = trk->rte_waypt_ct();
+
+ gbfputint32(i, mapsend_file_out);
+
+}
+
+static void mapsend_track_disp(const Waypoint* wpt)
+{
+ unsigned char c;
+ static int last_time;
+
+ /*
+ * Firmware Ver 4.06 (at least) has a defect when it's set for .01km
+ * tracking that will sometimes result in timestamps in the track
+ * going BACKWARDS. When mapsend sees this, it (stupidly) advances
+ * the date by one, ignoring the date on the TRK lines. This looks
+ * for time travel and just uses the previous time - it's better to
+ * be thought to be standing still than to be time-travelling!
+ *
+ * This is rumoured (but yet unconfirmed) to be fixed in f/w 5.12.
+ */
+ int32_t t = wpt->GetCreationTime().toTime_t();
+ if (t < last_time) {
+ t = last_time;
+ }
+
+ /* x = longitude */
+ gbfputdbl(wpt->longitude, mapsend_file_out);
+
+ /* x = latitude */
+ gbfputdbl(-wpt->latitude, mapsend_file_out);
+
+ /* altitude
+ * in V4.0+ this field is a float, it was previously an int
+ */
+ if (trk_version < 40) {
+ gbfputint32((int) wpt->altitude, mapsend_file_out);
+ } else {
+ gbfputflt((float) wpt->altitude, mapsend_file_out);
+ }
+
+ /* time */
+ gbfputint32(t, mapsend_file_out);
+ last_time = t;
+
+ /* validity */
+ gbfputint32(1, mapsend_file_out);
+
+ /* 0 centiseconds */
+ if (trk_version >= 30) {
+ c = lround(wpt->GetCreationTime().time().msec() / 10.0);
+ gbfwrite(&c, 1, 1, mapsend_file_out);
+ }
+}
+
+static void
+mapsend_track_write()
+{
+ track_disp_all(mapsend_track_hdr, nullptr, mapsend_track_disp);
+}
+
+static void
+mapsend_wpt_write()
+{
+ mapsend_hdr hdr = {13, {'4','D','5','3','3','3','3','0',' ','M','S'},
+ {'3', '0'}, ms_type_wpt, {0, 0, 0}
+ };
+ int wpt_count = waypt_count();
+
+ if (global_opts.objective == trkdata) {
+ mapsend_track_write();
+ } else {
+ gbfwrite(&hdr, sizeof(hdr), 1, mapsend_file_out);
+
+ if (global_opts.objective == wptdata) {
+ gbfputint32(wpt_count, mapsend_file_out);
+ waypt_disp_all(mapsend_waypt_pr);
+ } else if (global_opts.objective == rtedata) {
+
+ /* # of points - all routes */
+ gbfputint32(route_waypt_count(), mapsend_file_out);
+
+ /* write points - all routes */
+ route_disp_all(nullptr, nullptr, mapsend_waypt_pr);
+ }
+
+ int n = route_count();
+
+ gbfputint32(n, mapsend_file_out);
+
+ if (n) {
+ route_disp_all(mapsend_route_hdr, nullptr, mapsend_route_disp);
+ }
+ }
+}
+
+
+
+ff_vecs_t mapsend_vecs = {
+ ff_type_file,
+ FF_CAP_RW_ALL,
+ mapsend_rd_init,
+ mapsend_wr_init,
+ mapsend_rd_deinit,
+ mapsend_wr_deinit,
+ mapsend_read,
+ mapsend_wpt_write,
+ nullptr,
+ &mapsend_args,
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ Access to MapSend files.
+
+ Copyright (C) 2002 Robert Lipe, robertlipe@usa.net
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ *
+ * Information from:
+ * Mapsend File Format Description Revision 1.1, March 6, 2002 from Thales.
+ *
+ * Note this file format was clearly NOT designed for cross-architecture
+ * portability. In fact, because of the pascal nature of the 'string'
+ * data type described in that document, it's impractical to describe
+ * a 'struct waypoint' in C.
+ *
+ */
+
+struct mapsend_hdr {
+ char ms_length;
+ char ms_signature[11];
+ char ms_version[2];
+ char ms_type;
+ char _ms_type[3];
+};
+
+enum ms_type {
+ ms_type_rgn = 0,
+ ms_type_wpt = 1,
+ ms_type_track = 2,
+ ms_type_log = 3
+};
--- /dev/null
+/*
+
+ Support for Navigon Mobile Navigator .rte files.
+
+ Copyright (C) 2005 Olaf Klein, o.b.klein@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+/*
+ line structure, items delimited by '|'
+
+-|-|17|-|ZIP-Code|City|ZIP-Code2|Street|No.|-|-|longitude|latitude|-|-| + 0D0A
+
+*/
+
+#include "defs.h"
+#include "cet_util.h"
+#include "csv_util.h"
+#include <cctype>
+#include <cstdarg>
+#include <cstdio>
+#include <cstdlib>
+
+static gbfile* fin, *fout;
+static int curr_rte_num, target_rte_num;
+
+#define MYNAME "navigon"
+
+static char* index_opt;
+
+static
+QVector<arglist_t> nmn4_args = {
+ {"index", &index_opt, "Index of route to write (if more than one in source)", nullptr, ARGTYPE_INT, "1", nullptr , nullptr},
+};
+
+
+static void
+nmn4_check_line(char* line)
+{
+ char* c = line;
+ int i = 0;
+ while ((c = strchr(c, '|'))) {
+ c++;
+ i++;
+ }
+ is_fatal((i != 15),
+ MYNAME ": Invalid or unknown structure!");
+}
+
+static void
+nmn4_read_data()
+{
+ char* buff;
+ int line = 0;
+
+ QString zip2, city, street, number;
+
+ auto* route = new route_head;
+ route_add_head(route);
+
+ while ((buff = gbfgetstr(fin))) {
+ if ((line++ == 0) && fin->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+ char* str = buff = lrtrim(buff);
+ if (*buff == '\0') {
+ continue;
+ }
+
+ nmn4_check_line(buff);
+
+ /* for a quiet compiler */
+ QString zip1 = zip2 = city = street = number = QString();
+
+ auto* wpt = new Waypoint;
+
+ int column = -1;
+ QString c = csv_lineparse(str, "|", "", column++);
+ while (!c.isNull()) {
+ switch (column) {
+ case 0: /* "-" */ /* unknown fields for the moment */
+ case 1: /* "-" */
+ case 2: /* "-" */
+ case 3: /* "-" */
+ case 9: /* "-" */
+ case 10: /* "-" */
+ case 13: /* "-" */
+ case 14: /* "-" */
+ case 15: /* "" */
+ break;
+
+ case 4: /* ZIP Code */
+ if (c[0] != '-') {
+ zip1 = c;
+ }
+ break;
+
+ case 5: /* City */
+ if (c[0] != '-') {
+ city = c;
+ }
+ break;
+
+ case 6: /* ZIP Code -2- */
+ if (c[0] != '-') {
+ zip2 = c;
+ }
+ break;
+
+ case 7: /* Street */
+ if (c[0] != '-') {
+ street = c;
+ }
+ break;
+
+ case 8: /* Number */
+ if (c[0] != '-') {
+ number = c;
+ }
+
+ /*
+ This is our final index
+ All stuff for generating names or comments
+ is hold locally.
+
+ We don't have fields for street, city or zip-code.
+ Instead we construct a description from that.
+ */
+
+ if (zip1 == zip2) {
+ zip2 = QString();
+ }
+ if (!city.isEmpty()) {
+ /*
+ if any field following city has a value, add a comma to city
+ */
+ if (!street.isEmpty() || !number.isEmpty() || !zip2.isEmpty()) {
+ city += ",";
+ }
+ }
+
+ /* concatenates all fields to one string and release */
+ wpt->description = zip1.trimmed() + " " +
+ city.trimmed() + " " +
+ street.trimmed() + " " +
+ number.trimmed() + " " +
+ zip2.trimmed();
+
+ break;
+
+ case 11: /* longitude */
+ wpt->longitude = c.toDouble();
+ break;
+
+ case 12: /* latitude */
+ wpt->latitude = c.toDouble();
+ break;
+
+ }
+ c = QString::fromLatin1(csv_lineparse(nullptr, "|", "", column++));
+ }
+ route_add_wpt(route, wpt);
+ }
+}
+
+static void
+nmn4_route_hdr(const route_head*)
+{
+ curr_rte_num++;
+}
+
+static void
+nmn4_write_waypt(const Waypoint* wpt)
+{
+ char city[128], street[128], zipc[32], number[32];
+
+ if (curr_rte_num != target_rte_num) {
+ return;
+ }
+
+ strncpy(city, "-", sizeof(city));
+ strncpy(street, "-", sizeof(street));
+ strncpy(zipc, "-", sizeof(zipc));
+ strncpy(number, "-", sizeof(number));
+
+ /*
+ Population of specific data used by Navigon may come in the
+ future or it may be impossible. We currently output only the
+ coordinates in the output, but this is sufficient for Navigon.
+
+ The coordinates are the only item we are about guaranteed to have
+ when converting to any from any format, so we leave the other
+ fields unpopulated. So i have to pay Navigon a compliment for
+ implementing a simple data exchange.
+ */
+
+ gbfprintf(fout, "-|-|-|-|%s|%s|%s|%s|%s|-|-|%.5f|%.5f|-|-|\r\n",
+ zipc, city, zipc, street, number,
+ wpt->longitude, wpt->latitude);
+}
+
+static void
+nmn4_write_data()
+{
+
+ target_rte_num = 1;
+
+ if (index_opt != nullptr) {
+ target_rte_num = atoi(index_opt);
+ is_fatal(((target_rte_num > (int) route_count()) || (target_rte_num < 1)),
+ MYNAME ": invalid route number %d (1..%d))!\n", target_rte_num, route_count());
+ }
+
+ curr_rte_num = 0;
+ route_disp_all(nmn4_route_hdr, nullptr, nmn4_write_waypt);
+}
+
+
+/* %%% global callbacks %%% */
+
+static void
+nmn4_rd_init(const QString& fname)
+{
+ fin = gbfopen(fname, "rb", MYNAME);
+}
+
+static void
+nmn4_rd_deinit()
+{
+ gbfclose(fin);
+}
+
+static void
+nmn4_read()
+{
+ nmn4_read_data();
+}
+
+static void
+nmn4_wr_init(const QString& fname)
+{
+ fout = gbfopen(fname, "wb", MYNAME);
+}
+
+static void
+nmn4_wr_deinit()
+{
+ gbfclose(fout);
+}
+
+static void
+nmn4_write()
+{
+ nmn4_write_data();
+}
+
+/* --------------------------------------------------------------------------- */
+
+ff_vecs_t nmn4_vecs = {
+ ff_type_file,
+ { ff_cap_none, ff_cap_none, (ff_cap)(ff_cap_read | ff_cap_write)},
+ nmn4_rd_init,
+ nmn4_wr_init,
+ nmn4_rd_deinit,
+ nmn4_wr_deinit,
+ nmn4_read,
+ nmn4_write,
+ nullptr,
+ &nmn4_args,
+ CET_CHARSET_MS_ANSI, 1 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ Access to Garmin PCX5 files.
+ Format described in: http://www.garmin.com/manuals/PCX5_OwnersManual.pdf
+
+ Copyright (C) 2002-2017 Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <cmath> // for fabs
+#include <cstdlib> // for atoi
+#include <cstring> // for strstr, strncmp
+
+#include <QChar> // for operator==, QChar
+#include <QDate> // for QDate
+#include <QDateTime> // for QDateTime
+#include <QList> // for QList
+#include <QRegularExpression> // for QRegularExpression
+#include <QString> // for QString, QString::SectionSkipEmpty
+#include <QStringList> // for QStringList
+#include <QTime> // for QTime
+#include <QVector> // for QVector
+#include <Qt> // for CaseInsensitive, UTC
+
+#include "defs.h"
+#include "cet_util.h" // for cet_convert_init
+#include "csv_util.h" // for human_to_dec
+#include "garmin_tables.h" // for gt_find_icon_number_from_desc, PCX, gt_find_desc_from_icon_number
+#include "gbfile.h" // for gbfprintf, gbfclose, gbfopen, gbfgetstr, gbfile
+#include "src/core/datetime.h" // for DateTime
+
+
+static gbfile* file_in, *file_out;
+static short_handle mkshort_handle;
+static short_handle mkshort_handle2; /* for track and route names */
+static char* deficon = nullptr;
+static char* cartoexploreur;
+static int read_as_degrees;
+static int read_gpsu;
+static int route_ctr;
+static int comment_col = 60; /* This has a default */
+static int sym_col;
+static int lat_col;
+static int lon_col;
+
+#define MYNAME "PCX"
+
+static QVector<arglist_t> pcx_args = {{"deficon", &deficon, "Default icon name",
+ "Waypoint", ARGTYPE_STRING, ARG_NOMINMAX, nullptr},
+ {"cartoexploreur", &cartoexploreur,
+ "Write tracks compatible with Carto Exploreur",
+ nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr},
+ };
+
+static void rd_init(const QString& fname) {
+ file_in = gbfopen(fname, "rb", MYNAME);
+}
+
+static void rd_deinit() { gbfclose(file_in); }
+
+static void wr_init(const QString& fname) {
+ file_out = gbfopen(fname, "w", MYNAME);
+ mkshort_handle = mkshort_new_handle();
+ mkshort_handle2 = mkshort_new_handle();
+}
+
+static void wr_deinit() {
+ gbfclose(file_out);
+ mkshort_del_handle(&mkshort_handle);
+ mkshort_del_handle(&mkshort_handle2);
+}
+
+// Find the first token in string |in| when there may be leading whitespace.
+// These files have weird mixtures of spaces and tabs.
+static QString FirstTokenAt(const QString& in, int index) {
+ static const QRegularExpression sep(QRegularExpression(R"(\s+)"));
+ return in.mid(index, -1).section(sep, 0, 0, QString::SectionSkipEmpty);
+}
+
+// Centralize Date/Time parsing between Waypoint and Trackpoint readers.
+static void SetWaypointTime(Waypoint* wpt, const QString& date, const QString& time) {
+ QDate qdate = QDate::fromString(date, "dd-MMM-yy");
+ QTime qtime = QTime::fromString(time, "hh:mm:ss");
+ if (qdate.isValid() && qtime.isValid()) {
+ wpt->SetCreationTime(QDateTime(qdate, qtime, Qt::UTC));
+ }
+}
+
+// Loop and parse all the lines of the file. This is complicated by the
+// variety of programs in the wild that loosely use this format and that
+// there are two distinct versions of PCX.
+// In the simplest form, white spaces are disallowed in the individual
+// fields and everything is just whitespace separated and the fields have
+// a fixed order.
+// The presence of an "F" or "H" record changes the precedence of parse
+// to allow fields in any order and length, based on their position in
+// these header lines. Oddly, we've seen only 'W' records take this form.
+
+static void data_read() {
+ int symnum;
+ Waypoint* wpt_tmp;
+ char* buff;
+ route_head* track = nullptr;
+ route_head* route = nullptr;
+ int line_number = 0;
+
+ read_as_degrees = 0;
+ int points = 0;
+ const QRegularExpression sep(QRegularExpression(R"(\s+)"));
+
+ // Each line is both |buff| as a C string and |line| as a QString.
+ while ((buff = gbfgetstr(file_in))) {
+ const QString line = QString(buff).trimmed();
+ char* ibuf = lrtrim(buff);
+ if ((line_number++ == 0) && file_in->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+
+ switch (ibuf[0]) {
+ case 'W': {
+ const QStringList tokens = line.split(sep);
+ if (tokens.size() < 6) {
+ fatal(MYNAME
+ ": Unable to parse waypoint, not all required columns "
+ "contained\n");
+ }
+ // tokens[0] = "W".
+ QString name = tokens[1];
+ QString tbuf = tokens[2];
+ QString nbuf = tokens[3];
+ QString date = tokens[4];
+ QString time = tokens[5];
+ long alt = unknown_alt;
+ if (tokens.size() == 7) {
+ alt = tokens[6].toDouble();
+ }
+
+ QString desc;
+ if (comment_col > 0) {
+ desc = line.mid(comment_col, -1);
+ }
+
+ symnum = 18;
+ if (sym_col > 0) {
+ symnum = atoi(&ibuf[sym_col]);
+ }
+
+ // If we have explicit columns for lat and lon,
+ // copy those entire words (warning: no spaces)
+ // into the respective coord buffers.
+ if (lat_col > 0) {
+ tbuf = FirstTokenAt(line, lat_col);
+ }
+ if (lon_col > 0) {
+ nbuf = FirstTokenAt(line, lon_col);
+ }
+
+ wpt_tmp = new Waypoint;
+ wpt_tmp->altitude = alt;
+ SetWaypointTime(wpt_tmp, date, time);
+ wpt_tmp->shortname = name.trimmed();
+ wpt_tmp->description = desc.trimmed();
+ wpt_tmp->icon_descr = gt_find_desc_from_icon_number(symnum, PCX);
+
+ double lat = 0;
+ double lon = 0;
+ if (read_as_degrees || read_gpsu) {
+ human_to_dec(tbuf, &lat, &lon, 1);
+ human_to_dec(nbuf, &lat, &lon, 2);
+ wpt_tmp->longitude = lon;
+ wpt_tmp->latitude = lat;
+ } else {
+ lat = tbuf.mid(1, -1).toDouble();
+ lon = nbuf.mid(1, -1).toDouble();
+ if (tbuf[0] == 'S') {
+ lat = -lat;
+ }
+ if (nbuf[0] == 'W') {
+ lon = -lon;
+ }
+ wpt_tmp->longitude = ddmm2degrees(lon);
+ wpt_tmp->latitude = ddmm2degrees(lat);
+ }
+
+ if (route != nullptr) {
+ route_add_wpt(route, new Waypoint(*wpt_tmp));
+ }
+ waypt_add(wpt_tmp);
+ points++;
+ break;
+ }
+ case 'H':
+ /* Garmap2 has headers
+ "H(2 spaces)LATITUDE(some spaces)LONGITUDE(etc... followed by);track
+ everything else is
+ H(2 chars)TN(trackname\0)
+ */
+ if (points > 0) {
+ track = nullptr;
+ points = 0;
+ }
+ if (track == nullptr) {
+ if (ibuf[3] == 'L' && ibuf[4] == 'A') {
+ track = new route_head;
+ track->rte_name = "track";
+ track_add_head(track);
+ } else if (ibuf[3] == 'T' && ibuf[4] == 'N') {
+ track = new route_head;
+ track->rte_name = &ibuf[6];
+ track_add_head(track);
+ }
+ }
+ break;
+ case 'R':
+ route = new route_head;
+ route->rte_name = QString(&ibuf[1]).trimmed();
+ route_add_head(route);
+ break;
+ case 'T': {
+ const QStringList tokens = line.split(sep);
+ if (tokens.size() < 6) {
+ fatal(MYNAME
+ ": Unable to parse trackpoint, not all required columns "
+ "contained\n");
+ }
+
+ // tokens[0] = "W".
+ QString tbuf = tokens[1];
+ QString nbuf = tokens[2];
+ QString date = tokens[3];
+ QString time = tokens[4];
+ double alt = tokens[5].toDouble();
+
+ wpt_tmp = new Waypoint;
+ SetWaypointTime(wpt_tmp, date, time);
+
+ double lat, lon;
+ if (read_as_degrees) {
+ human_to_dec(tbuf, &lat, &lon, 1);
+ human_to_dec(nbuf, &lat, &lon, 2);
+
+ wpt_tmp->longitude = lon;
+ wpt_tmp->latitude = lat;
+ } else {
+ lat = tbuf.mid(1, -1).toDouble();
+ lon = nbuf.mid(1, -1).toDouble();
+ if (tbuf[0] == 'S') {
+ lat = -lat;
+ }
+ if (nbuf[0] == 'W') {
+ lon = -lon;
+ }
+ wpt_tmp->longitude = ddmm2degrees(lon);
+ wpt_tmp->latitude = ddmm2degrees(lat);
+ }
+ wpt_tmp->altitude = alt;
+
+ /* Did we get a track point before a track header? */
+ if (track == nullptr) {
+ track = new route_head;
+ track->rte_name = "Default";
+ track_add_head(track);
+ }
+ track_add_wpt(track, wpt_tmp);
+ points++;
+ break;
+ }
+ case 'U':
+ read_as_degrees = !strncmp("LAT LON DEG", ibuf + 3, 11);
+ if (strstr(ibuf, "UTM")) {
+ fatal(MYNAME ": UTM is not supported.\n");
+ }
+ break;
+ // GPSU is apparently PCX but with a different definition
+ // of "LAT LON DM" - unlike the other, it actually IS decimal
+ // minutes.
+ case 'I':
+ read_gpsu = !(strstr(ibuf, "GPSU") == nullptr);
+ break;
+ // This is a format specifier. Use this line to figure out
+ // where our other columns start.
+ case 'F': {
+ comment_col = line.indexOf("comment", 0, Qt::CaseInsensitive);
+ sym_col = line.indexOf("symbol", 0, Qt::CaseInsensitive);
+ lat_col = line.indexOf("latitude", 0, Qt::CaseInsensitive);
+ lon_col = line.indexOf("longitude", 0, Qt::CaseInsensitive);
+ } break;
+ default:
+ break;
+ }
+ }
+}
+
+static void gpsutil_disp(const Waypoint* wpt) {
+ int icon_token = 0;
+
+ double lon = degrees2ddmm(wpt->longitude);
+ double lat = degrees2ddmm(wpt->latitude);
+
+ QDateTime dt = wpt->GetCreationTime().toUTC();
+ const QString ds = dt.toString("dd-MMM-yy hh:mm:ss").toUpper();
+
+ if (deficon) {
+ icon_token = atoi(deficon);
+ } else {
+ icon_token = gt_find_icon_number_from_desc(wpt->icon_descr, PCX);
+ if (get_cache_icon(wpt)) {
+ icon_token = gt_find_icon_number_from_desc(get_cache_icon(wpt), PCX);
+ }
+ }
+
+ gbfprintf(file_out, "W %-6.6s %c%08.5f %c%011.5f %s %5.f %-40.40s %5e %d\n",
+ global_opts.synthesize_shortnames
+ ? CSTRc(mkshort_from_wpt(mkshort_handle, wpt))
+ : CSTRc(wpt->shortname),
+ lat < 0.0 ? 'S' : 'N', fabs(lat), lon < 0.0 ? 'W' : 'E', fabs(lon),
+ CSTR(ds), (wpt->altitude == unknown_alt) ? -9999 : wpt->altitude,
+ (wpt->description != nullptr) ? CSTRc(wpt->description) : "", 0.0,
+ icon_token);
+}
+
+static void pcx_track_hdr(const route_head* trk) {
+ route_ctr++;
+
+ QString default_name = QString::asprintf("Trk%03d", route_ctr);
+ QString name =
+ mkshort(mkshort_handle2,
+ trk->rte_name.isEmpty() ? CSTR(default_name) : trk->rte_name);
+ /* Carto Exploreur (popular in France) chokes on trackname headers,
+ * so provide option to suppress these.
+ */
+ if (!cartoexploreur) {
+ gbfprintf(file_out, "\n\nH TN %s\n", CSTR(name));
+ }
+ gbfprintf(file_out,
+ "H LATITUDE LONGITUDE DATE TIME ALT ;track\n");
+}
+
+static void pcx_route_hdr(const route_head* rte) {
+ route_ctr++;
+ QString default_name = QString::asprintf("Rte%03d", route_ctr);
+
+ QString name = mkshort(
+ mkshort_handle2, rte->rte_name.isEmpty() ? default_name : rte->rte_name);
+
+ /* see pcx_track_hdr */
+ if (!cartoexploreur) {
+ gbfprintf(file_out, "\n\nR %s\n", CSTR(name));
+ }
+ gbfprintf(file_out,
+ "\n"
+ "H IDNT LATITUDE LONGITUDE DATE TIME ALT "
+ "DESCRIPTION PROXIMITY SYMBOL "
+ ";waypts\n");
+}
+
+static void pcx_track_disp(const Waypoint* wpt) {
+ double lon = degrees2ddmm(wpt->longitude);
+ double lat = degrees2ddmm(wpt->latitude);
+
+ QDateTime dt = wpt->GetCreationTime().toUTC();
+ const QString ds = dt.toString("dd-MMM-yy hh:mm:ss").toUpper();
+
+ gbfprintf(file_out, "T %c%08.5f %c%011.5f %s %.f\n", lat < 0.0 ? 'S' : 'N',
+ fabs(lat), lon < 0.0 ? 'W' : 'E', fabs(lon), CSTR(ds),
+ wpt->altitude);
+}
+
+static void data_write() {
+ gbfprintf(file_out,
+ "H SOFTWARE NAME & VERSION\n"
+ "I PCX5 2.09\n"
+ "\n"
+ "H R DATUM IDX DA DF DX "
+ " DY DZ\n"
+ "M G WGS 84 121 +0.000000e+00 +0.000000e+00 "
+ "+0.000000e+00 +0.000000e+00 +0.000000e+00\n"
+ "\n"
+ "H COORDINATE SYSTEM\n"
+ "U LAT LON DM\n");
+
+ setshort_length(mkshort_handle, 6);
+
+ setshort_length(mkshort_handle2, 20); /* for track and route names */
+ setshort_whitespace_ok(mkshort_handle2, 0);
+ setshort_mustuniq(mkshort_handle2, 0);
+
+ if (global_opts.objective == wptdata) {
+ gbfprintf(file_out,
+ "\n"
+ "H IDNT LATITUDE LONGITUDE DATE TIME ALT "
+ "DESCRIPTION PROXIMITY SYMBOL "
+ ";waypts\n");
+
+ waypt_disp_all(gpsutil_disp);
+ } else if (global_opts.objective == trkdata) {
+ route_ctr = 0;
+ track_disp_all(pcx_track_hdr, nullptr, pcx_track_disp);
+ } else if (global_opts.objective == rtedata) {
+ route_ctr = 0;
+ route_disp_all(pcx_route_hdr, nullptr, gpsutil_disp);
+ }
+}
+
+ff_vecs_t pcx_vecs = {
+ ff_type_file, FF_CAP_RW_ALL, rd_init, wr_init, rd_deinit,
+ wr_deinit, data_read, data_write, nullptr, &pcx_args,
+ CET_CHARSET_ASCII, 1 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ Read and write PocketFMS files.
+
+ Copyright (C) 2009 Tobias Kretschmar, tobias.kretschmar@gmx.de
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include "defs.h"
+
+#define MYNAME "PocketFMS Breadcrumbs"
+
+static char header_id[] = "BRC";
+
+struct breadcrumb {
+ // header
+ char id[4]; // 0x42 0x52 0x43 0x00 <=> "BRC"
+ uint16_t version; // 0x0100
+ uint16_t reserve1; // 0x0000
+ // data
+ float latitude;
+ float longitude;
+ float altitude; // meter
+ float speed; // m/s
+ float course; // degrees
+ float magvar; // degrees
+ float separation; // meter
+ float ehpe; // estimated horizontal position error
+ float evpe; // estimated vertical position error
+ float espe; // estimated speed position error
+ uint16_t fix; // 1..none, 2..2D, 3..3D, 4..dgps, 5pps
+ uint16_t year; // 1999..2999
+ uint16_t month; // 1..12
+ uint16_t day; // 0..31
+ uint16_t hour; // 0.23
+ uint16_t minute; // 0..59
+ uint16_t second; // 0..59
+ uint16_t reserve2; // 0x0000
+};
+
+static gbfile* file_in, *file_out;
+
+static void
+rd_init(const QString& fname)
+{
+ file_in = gbfopen_le(fname, "rb", MYNAME);
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(file_in);
+}
+
+static void
+wr_init(const QString& fname)
+{
+ file_out = gbfopen_le(fname, "wb", MYNAME);
+}
+
+static void
+wr_deinit()
+{
+ gbfclose(file_out);
+}
+
+static void
+read_tracks()
+{
+ breadcrumb bc;
+ auto* trk_head = new route_head;
+ trk_head->rte_num = 1;
+ trk_head->rte_name = "PocketFMS";
+ trk_head->rte_desc = "Breadcrumb";
+ trk_head->rte_urls.AddUrlLink(UrlLink("www.pocketfms.com"));
+ track_add_head(trk_head);
+
+ while (1 == gbfread(&bc, sizeof(bc), 1, file_in)) {
+ struct tm tm;
+
+ if (strcmp(bc.id, header_id) != 0) {
+ fatal(MYNAME ": invalid breadcrumb header in input file.\n");
+ }
+
+ memset(&tm, 0, sizeof(tm));
+ tm.tm_year = le_readu16(&bc.year)-1900;
+ tm.tm_mon = le_readu16(&bc.month)-1;
+ tm.tm_mday = le_readu16(&bc.day);
+ tm.tm_hour = le_readu16(&bc.hour);
+ tm.tm_min = le_readu16(&bc.minute);
+ tm.tm_sec = le_readu16(&bc.second);
+
+ auto* wpt = new Waypoint;
+ wpt->latitude = le_read_float(&bc.latitude);
+ wpt->longitude = le_read_float(&bc.longitude);
+ wpt->altitude = FEET_TO_METERS(le_read_float(&bc.altitude));
+ wpt->SetCreationTime(mkgmtime(&tm));
+ wpt->hdop = le_read_float(&bc.ehpe);
+ wpt->vdop = le_read_float(&bc.evpe);
+ wpt->pdop = le_read_float(&bc.espe);
+ wpt->course = le_read_float(&bc.course);
+ wpt->speed = le_read_float(&bc.speed);
+ wpt->fix = (fix_type)(le_readu16(&bc.fix) - 1);
+
+ track_add_wpt(trk_head, wpt);
+ }
+}
+
+static void
+pocketfms_waypt_disp(const Waypoint* wpt)
+{
+ breadcrumb bc;
+
+ memset(&bc, 0, sizeof(bc));
+ const time_t tt = wpt->GetCreationTime().toTime_t();
+ struct tm* tm = localtime(&tt);
+ if (wpt->creation_time.isValid()) {
+ // It seems odd to reread waypoint time here, but this whole format
+ // is likely short-lived.
+ const time_t tt2 = wpt->GetCreationTime().toTime_t();
+ tm = gmtime(&tt2);
+ }
+
+ strcpy(bc.id, header_id);
+ le_write16(&bc.version, 1);
+ le_write_float(&bc.latitude, wpt->latitude);
+ le_write_float(&bc.longitude, wpt->longitude);
+ le_write_float(&bc.altitude, METERS_TO_FEET(wpt->altitude));
+ if (tm) {
+ le_write16(&bc.year, tm->tm_year + 1900);
+ le_write16(&bc.month, tm->tm_mon + 1);
+ le_write16(&bc.day, tm->tm_mday);
+ le_write16(&bc.hour, tm->tm_hour);
+ le_write16(&bc.minute, tm->tm_min);
+ le_write16(&bc.second, tm->tm_sec);
+ }
+ le_write_float(&bc.ehpe, wpt->hdop);
+ le_write_float(&bc.evpe, wpt->vdop);
+ le_write_float(&bc.espe, wpt->pdop);
+ le_write_float(&bc.course, wpt->course);
+ le_write_float(&bc.speed, wpt->speed);
+ le_write16(&bc.fix, wpt->fix+1);
+
+ gbfwrite(&bc, sizeof(bc), 1, file_out);
+}
+
+static void
+data_read()
+{
+ read_tracks();
+}
+
+static void
+data_write()
+{
+ track_disp_all(nullptr, nullptr, pocketfms_waypt_disp);
+}
+
+ff_vecs_t pocketfms_bc_vecs = {
+ ff_type_file,
+ {
+ ff_cap_none, /* waypoints */
+ (ff_cap)(ff_cap_read | ff_cap_write), /* tracks */
+ ff_cap_none /* routes */
+ },
+ rd_init,
+ wr_init,
+ rd_deinit,
+ wr_deinit,
+ data_read,
+ data_write,
+ nullptr,
+ nullptr,
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ Read PocketFMS flightplan files.
+
+ Copyright (C) 2009 Tobias Kretschmar, tobias.kretschmar@gmx.de
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include <QString> // for QString
+#include <QXmlStreamAttributes> // for QXmlStreamAttributes
+
+#include "defs.h"
+#include "xmlgeneric.h" // for cb_cdata, xg_callback, xg_string, cb_start, cb_end, xg_cb_type, xml_deinit, xml_init, xml_read, xg_tag_mapping
+
+
+static int isFirst = 1;
+static route_head* route = nullptr;
+static Waypoint* wpt_to, *wpt_from;
+static double dest_altitude;
+
+#define MYNAME "PocketFMS FlightPlan"
+
+static xg_callback wpt_s, wpt_from_lat, wpt_from_lon, wpt_from_name, wpt_from_elev;
+static xg_callback wpt_e, wpt_to_lat, wpt_to_lon, wpt_to_name, wpt_to_elev, wpt_altitude;
+
+static xg_tag_mapping gl_map[] = {
+ { wpt_s, cb_start, "/PocketFMSFlightplan/LIB" },
+ { wpt_from_lat, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Latitude" },
+ { wpt_from_lon, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Longitude" },
+ { wpt_from_elev, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Elevation" },
+ { wpt_from_name, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/FriendlyShortname" },
+ { wpt_to_lat, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Latitude" },
+ { wpt_to_lon, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Longitude" },
+ { wpt_to_name, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/FriendlyShortname" },
+ { wpt_to_elev, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Elevation" },
+ { wpt_altitude, cb_start, "/PocketFMSFlightplan/LIB/PlannedAltitude" },
+ { wpt_e, cb_end, "/PocketFMSFlightplan/LIB" },
+ { nullptr, (xg_cb_type)0, nullptr}
+};
+
+static void
+rd_init(const QString& fname)
+{
+ xml_init(fname, gl_map, nullptr);
+}
+
+static void
+data_read()
+{
+ xml_read();
+}
+
+static void
+rd_deinit()
+{
+ if (route != nullptr) {
+ Waypoint* head = route->waypoint_list.front();
+ Waypoint* tail = route->waypoint_list.back();
+ if (head != nullptr) {
+ route->rte_name = head->shortname;
+ }
+ route->rte_name += " - ";
+ if (tail != nullptr) {
+ route->rte_name += tail->shortname;
+ tail->altitude = dest_altitude;
+ }
+ }
+ xml_deinit();
+}
+
+void wpt_s(xg_string, const QXmlStreamAttributes*)
+{
+ if (isFirst == 1) {
+ wpt_from = new Waypoint;
+ route = new route_head;
+ route->rte_desc="PocketFMS flightplan";
+ route_add_head(route);
+ }
+ wpt_to = new Waypoint;
+}
+
+void wpt_e(xg_string, const QXmlStreamAttributes*)
+{
+ if (isFirst == 1) {
+ route_add_wpt(route, wpt_from);
+ if (doing_wpts) {
+ waypt_add(new Waypoint(*wpt_from));
+ }
+ wpt_from = nullptr;
+ isFirst = 0;
+ }
+ route_add_wpt(route, wpt_to);
+ if (doing_wpts) {
+ waypt_add(new Waypoint(*wpt_to));
+ }
+ wpt_to = nullptr;
+}
+
+void wpt_from_lat(xg_string args, const QXmlStreamAttributes*)
+{
+ if (wpt_from != nullptr) {
+ wpt_from->latitude = args.toDouble();
+ }
+}
+
+void wpt_from_lon(xg_string args, const QXmlStreamAttributes*)
+{
+ if (wpt_from != nullptr) {
+ wpt_from->longitude = args.toDouble();
+ }
+}
+
+void wpt_from_name(xg_string args, const QXmlStreamAttributes*)
+{
+ if (wpt_from != nullptr) {
+ wpt_from->shortname += args;
+ }
+}
+
+void wpt_from_elev(xg_string args, const QXmlStreamAttributes*)
+{
+ if (wpt_from != nullptr) {
+ wpt_from->altitude = FEET_TO_METERS(args.toDouble());
+ }
+}
+
+void wpt_to_lat(xg_string args, const QXmlStreamAttributes*)
+{
+ wpt_to->latitude = args.toDouble();
+}
+
+void wpt_to_lon(xg_string args, const QXmlStreamAttributes*)
+{
+ wpt_to->longitude = args.toDouble();
+}
+
+void wpt_to_name(xg_string args, const QXmlStreamAttributes*)
+{
+ wpt_to->shortname += args;
+}
+
+void wpt_to_elev(xg_string args, const QXmlStreamAttributes*)
+{
+ dest_altitude = FEET_TO_METERS(args.toDouble());
+}
+
+void wpt_altitude(xg_string, const QXmlStreamAttributes* attrv)
+{
+ int isFeet = 0;
+
+ if (attrv->hasAttribute("Value")) {
+ wpt_to->altitude = attrv->value("Value").toString().toDouble();
+ }
+ if (attrv->hasAttribute("Unit")) {
+ isFeet = (attrv->value("Unit") == u"ft");
+ }
+ if (isFeet) {
+ wpt_to->altitude = FEET_TO_METERS(wpt_to->altitude);
+ }
+}
+
+ff_vecs_t pocketfms_fp_vecs = {
+ ff_type_file,
+ {
+ ff_cap_read /* waypoints */,
+ ff_cap_none /* tracks */,
+ ff_cap_read /* routes */
+ },
+ rd_init,
+ nullptr,
+ rd_deinit,
+ nullptr,
+ data_read,
+ nullptr,
+ nullptr,
+ nullptr,
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ PocketFMS waypoint text files (wpt).
+
+ Copyright (C) 2009 Tobias Kretschmar, tobias.kretschmar@gmx.de
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "defs.h"
+#include "csv_util.h"
+#include <cstdio>
+#include <cstdlib>
+
+#define MYNAME "PocketFMS waypoint text file format"
+
+static gbfile* file_in, *file_out;
+
+static void
+rd_init(const QString& fname)
+{
+ file_in = gbfopen_le(fname, "r", MYNAME);
+}
+
+static double wppos_to_dec(char* value)
+{
+ if (strstr(value, "\xB0") == nullptr) {
+ return atof(value);
+ } else {
+ int degrees, minutes;
+ float seconds;
+ int sign = 1;
+
+ if (toupper(value[0]) == 'N' || toupper(value[0]) == 'E' || value[0] == '+') {
+ value = &value[1];
+ } else if (toupper(value[0]) == 'S' || toupper(value[0]) == 'W' || value[0] == '-') {
+ value = &value[1];
+ sign = -1;
+ }
+
+ sscanf(value, "%d\xB0%d'%f\"", °rees, &minutes, &seconds);
+ return sign * (degrees + ((float)minutes / 60) + (seconds / 3600));
+ }
+}
+
+static void
+data_read()
+{
+ char* buff;
+ int linecount = 0;
+ while ((buff = gbfgetstr(file_in))) {
+ rtrim(buff);
+ if (strlen(buff) == 0) {
+ break;
+ }
+ linecount++;
+ auto* wpt = new Waypoint;
+ char* s = buff;
+ s = csv_lineparse(s, "\\w", "", linecount);
+ if (!s) {
+ fatal(MYNAME "Invalid name");
+ }
+ wpt->shortname = s;
+ s = csv_lineparse(nullptr, "\\w", "", linecount);
+ if (!s) {
+ fatal(MYNAME "Invalid latitude %s", qPrintable(wpt->shortname));
+ }
+ wpt->latitude = wppos_to_dec(s);
+
+ s = csv_lineparse(nullptr, "\\w", "", linecount);
+ if (!s) {
+ fatal(MYNAME "Invalid longitude %s", qPrintable(wpt->shortname));
+ }
+ wpt->longitude = wppos_to_dec(s);
+ waypt_add(wpt);
+
+ // continue reading until csv_lineparse returns null indicating all dynamic memory has been deallocated.
+ while (csv_lineparse(nullptr, "\\w", "", linecount));
+ }
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(file_in);
+}
+
+static void
+wr_init(const QString& fname)
+{
+ file_out = gbfopen_le(fname, "w", MYNAME);
+}
+
+static void
+enigma_waypt_disp(const Waypoint* wpt)
+{
+ if (!wpt->shortname.isEmpty()) {
+ // The output might have a space or control character.
+ int l = wpt->shortname.length();
+ char *t = (char*) xmalloc(l + 1);
+ char* d = t;
+ for (int i = 0; i < l; i++) {
+ char s = wpt->shortname[i].cell();
+ if (isgraph(s)) {
+ *d++ = s;
+ }
+ }
+ *d = 0;
+ gbfprintf(file_out, "%s %f %f\n", t, wpt->latitude, wpt->longitude);
+ xfree(t);
+ } else {
+ gbfprintf(file_out, "%s %f %f\n", "NONAME", wpt->latitude, wpt->longitude);
+ }
+}
+
+static void
+data_write()
+{
+ waypt_disp_all(enigma_waypt_disp);
+}
+
+static void
+wr_deinit()
+{
+ gbfclose(file_out);
+}
+
+ff_vecs_t pocketfms_wp_vecs = {
+ ff_type_file,
+ {
+ (ff_cap)(ff_cap_read | ff_cap_write), /* waypoints */
+ ff_cap_none, /* tracks */
+ ff_cap_none, /* routes */
+ },
+ rd_init,
+ wr_init,
+ rd_deinit,
+ wr_deinit,
+ data_read,
+ data_write,
+ nullptr,
+ nullptr,
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+
+ Support for SkymapII / SkymapIIIC & KMD150 ascii files
+
+ Copyright (C) 2008 Olaf Klein, o.b.klein@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+
+
+#include "defs.h"
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+
+#define MYNAME "skyforce"
+
+
+static
+QVector<arglist_t> skyforce_args = {
+};
+
+static gbfile* fin, *fout;
+static int rte_num, wpt_num;
+static short_handle short_h;
+static const Waypoint* prev_wpt;
+
+
+static Waypoint*
+skyforce_parse_coords(const char* str)
+{
+ if (strlen(str) < 38) {
+ fatal(MYNAME ": Incomplete line!\n");
+ }
+
+ auto* wpt = new Waypoint;
+
+ wpt->latitude = atof(str + 21);
+ if (str[20] == 'S') {
+ wpt->latitude = -wpt->latitude;
+ }
+ wpt->latitude = ddmm2degrees(wpt->latitude);
+
+ wpt->longitude = atof(str + 30);
+ if (str[29] == 'W') {
+ wpt->longitude = -wpt->longitude;
+ }
+ wpt->longitude = ddmm2degrees(wpt->longitude);
+
+ return wpt;
+}
+
+
+static Waypoint*
+skyforce_parse_wpt(const char* str, int* rte_num_out)
+{
+ Waypoint* wpt = skyforce_parse_coords(str);
+ if (wpt == nullptr) {
+ return nullptr;
+ }
+
+ // The line has fixed columns and starts like:
+ // R 001 029 BEARHILL N42...
+ // Grab "BEARHILL" and whack trailing space.
+ wpt->shortname = QString(str).mid(10,9).trimmed();
+
+ if (rte_num_out) {
+ *rte_num_out = atoi(str + 2);
+ }
+
+ return wpt;
+}
+
+
+static Waypoint*
+skyforce_parse_trk(const char* str)
+{
+ char buf[15];
+
+ Waypoint* wpt = skyforce_parse_coords(str);
+ if (wpt == nullptr) {
+ return nullptr;
+ }
+ strncpy(buf, str + 2, sizeof(buf) - 1);
+ buf[14] = 0;
+
+ QDateTime dt = QDateTime::fromString(buf, "ddMMyy hhmmss");
+ dt.setTimeSpec(Qt::UTC);
+ dt = dt.addYears(100);
+
+ wpt->SetCreationTime(dt);
+ int len = strlen(str);
+
+ if (len >= 45) {
+ WAYPT_SET(wpt, speed, KNOTS_TO_MPS(atof(str + 39)));
+ }
+ if (len >= 59) {
+ wpt->altitude = FEET_TO_METERS(atof(str + 54));
+ if (str[53] == '-') {
+ wpt->altitude = -wpt->altitude;
+ }
+ }
+
+ return wpt;
+}
+
+
+static void
+skyforce_head_disp_cb(const route_head* head)
+{
+ prev_wpt = nullptr;
+ if (head->rte_waypt_ct() <= 0) {
+ return;
+ }
+
+ wpt_num = 0;
+ rte_num++;
+
+ if (rte_num > 999) {
+ if (rte_num == 1000) {
+ warning(MYNAME ": Can't store more than 999 routes. Some routes skipped!\n");
+ }
+ return;
+ }
+}
+
+
+static void
+skyforce_waypt_disp_cb(const Waypoint* wpt)
+{
+ char buf[75]; /* long enough for all data types */
+
+
+ memset(buf, ' ', sizeof(buf));
+ buf[sizeof(buf) - 1] = '\0';
+
+ switch (global_opts.objective) {
+ case wptdata:
+ buf[0] = 'W';
+ break;
+ case trkdata:
+ buf[0] = 'L';
+ break;
+ case rtedata:
+ buf[0] = 'R';
+ break;
+ default: ; /* should never happen */
+ }
+
+ if (global_opts.objective == trkdata) {
+ struct tm tm;
+
+ const time_t tt = wpt->GetCreationTime().toTime_t();
+ tm = *gmtime(&tt);
+ strftime(buf + 2, sizeof(buf) - 2, "%d%m%y %H%M%S ", &tm);
+ } else {
+ if (rte_num > 999) {
+ return;
+ }
+
+ wpt_num++;
+ if (wpt_num > 999) {
+ if (wpt_num == 1000) {
+ warning(MYNAME ": Can't store more than 999 waypoints. Some waypoints skipped!\n");
+ }
+ return;
+ }
+ QString name;
+ if (global_opts.synthesize_shortnames) {
+ name = mkshort_from_wpt(short_h, wpt);
+ } else {
+ name = mkshort(short_h, wpt->shortname);
+ }
+
+ if (global_opts.objective == rtedata) {
+ snprintf(buf + 2, sizeof(buf) - 2, "%03d ", rte_num);
+ }
+ snprintf(buf + 6, sizeof(buf) - 6, "%03d %-9s ", wpt_num, CSTR(name));
+ }
+
+
+ double lat = degrees2ddmm(wpt->latitude);
+ buf[20] = (wpt->latitude < 0) ? 'S' : 'N';
+ snprintf(&buf[21], sizeof(buf) - 21, "%06.2f ", fabs(lat));
+
+ double lon = degrees2ddmm(wpt->longitude);
+ buf[29] = (wpt->longitude < 0) ? 'W' : 'E';
+ snprintf(&buf[30], sizeof(buf) - 30, "%08.2f ", fabs(lon));
+
+ if (global_opts.objective == trkdata) {
+ double alt;
+
+ if (wpt->altitude == unknown_alt) {
+ alt = 0;
+ } else {
+ alt = METERS_TO_FEET(wpt->altitude);
+ }
+ double speed = MPS_TO_KNOTS(waypt_speed(prev_wpt, wpt));
+
+ snprintf(&buf[39], sizeof(buf) - 39, "%06.2f 000.00 %c%05d",
+ speed,
+ alt < 0 ? '-' : '+', si_round(fabs(alt)));
+ }
+
+ rtrim(buf);
+ gbfprintf(fout, "%s\n", buf);
+
+ prev_wpt = wpt;
+}
+
+/*******************************************************************************
+* %%% global callbacks called by gpsbabel main process %%% *
+*******************************************************************************/
+
+static void
+skyforce_rd_init(const QString& fname)
+{
+ fin = gbfopen(fname, "r", MYNAME);
+}
+
+
+static void
+skyforce_rd_deinit()
+{
+ gbfclose(fin);
+}
+
+
+static void
+skyforce_read()
+{
+ char* str;
+
+ wpt_num = 0;
+ route_head* rte = nullptr;
+ route_head* trk = nullptr;
+ rte_num = -1;
+
+ while ((str = gbfgetstr(fin))) {
+
+ Waypoint* wpt;
+ int i;
+
+ str = lrtrim(str);
+ if (*str == '\0') {
+ continue;
+ }
+
+ switch (*str) {
+
+ case 'W':
+ wpt = skyforce_parse_wpt(str, nullptr);
+ if (wpt == nullptr) {
+ continue;
+ }
+ waypt_add(wpt);
+ break;
+
+ case 'R':
+ wpt = skyforce_parse_wpt(str, &i);
+ if (wpt == nullptr) {
+ continue;
+ }
+
+ if (i != rte_num) {
+ rte_num = i;
+ rte = nullptr;
+ }
+
+ if (rte == nullptr) {
+ rte = new route_head;
+ route_add_head(rte);
+ rte->rte_num = rte_num;
+ }
+ route_add_wpt(rte, wpt);
+ break;
+
+ case 'L':
+ wpt = skyforce_parse_trk(str);
+ if (wpt == nullptr) {
+ continue;
+ }
+ if (trk == nullptr) {
+ trk = new route_head;
+ track_add_head(trk);
+ }
+ track_add_wpt(trk, wpt);
+ break;
+
+ default:
+ fatal(MYNAME ": Invalid line marker '%c'!\n", *str);
+ }
+ }
+}
+
+
+static void
+skyforce_wr_init(const QString& fname)
+{
+ fout = gbfopen(fname, "w", MYNAME);
+
+ short_h = mkshort_new_handle();
+
+ setshort_length(short_h, 9);
+ setshort_badchars(short_h, "\r\n\t");
+ setshort_mustupper(short_h, 1);
+ setshort_mustuniq(short_h, 1);
+ setshort_whitespace_ok(short_h, 0);
+ setshort_repeating_whitespace_ok(short_h, 0);
+
+ wpt_num = 0;
+ rte_num = 0;
+}
+
+
+static void
+skyforce_wr_deinit()
+{
+ mkshort_del_handle(&short_h);
+ gbfclose(fout);
+}
+
+
+static void
+skyforce_write()
+{
+ switch (global_opts.objective) { /* We can only write one data type at a time */
+
+ case wptdata:
+ setshort_defname(short_h, "WPT");
+ waypt_disp_all(skyforce_waypt_disp_cb);
+ break;
+
+ case rtedata:
+ setshort_defname(short_h, "RTE");
+ setshort_mustuniq(short_h, 0);
+ route_disp_all(skyforce_head_disp_cb, nullptr, skyforce_waypt_disp_cb);
+ break;
+
+ case trkdata:
+ track_disp_all(skyforce_head_disp_cb, nullptr, skyforce_waypt_disp_cb);
+ break;
+
+ case posndata:
+ fatal(MYNAME ": Realtime positioning not supported.\n");
+ break;
+
+ default:
+ fatal(MYNAME ": Unknown data mode!\n");
+ }
+}
+
+
+/**************************************************************************/
+
+ff_vecs_t skyforce_vecs = {
+ ff_type_file,
+ FF_CAP_RW_ALL, /* read and write waypoints, tracks and routes*/
+ skyforce_rd_init,
+ skyforce_wr_init,
+ skyforce_rd_deinit,
+ skyforce_wr_deinit,
+ skyforce_read,
+ skyforce_write,
+ nullptr,
+ &skyforce_args,
+ CET_CHARSET_ASCII, 1
+ , NULL_POS_OPS,
+ nullptr
+};
+
+/**************************************************************************/
--- /dev/null
+/*
+
+ Support for Suunto Trackmanager SDF format.
+
+ Copyright (C) 2005,2007 Olaf Klein, o.b.klein@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+/*
+ 2006/04/05: initial release (not published in GPSBabel)
+ 2006/07/19: finished reader and writer for type 4,5,28 of ver. 1
+ 2006/10/31: remove wptdata from case statement (data_write)
+
+ ToDo: Ascending/Descending
+*/
+
+#include "defs.h"
+
+#if CSVFMTS_ENABLED
+
+#include <algorithm> // for sort
+#include <cstdlib> // for atoi
+#include <cstring> // for strchr
+#include <ctime> // for localtime, strftime
+
+#include <QDate> // for QDate
+#include <QDateTime> // for QDateTime
+#include <QList> // for QList<>::iterator, QList
+#include <QRegularExpression> // for QRegularExpression
+#include <QString> // for QString, operator+
+#include <QStringList> // for QStringList
+#include <QTime> // for QTime
+#include <QtGlobal> // for qAsConst, QAddConst<>::Type
+
+#include "cet_util.h" // for cet_convert_init
+#include "csv_util.h" // for csv_lineparse
+#include "gbfile.h" // for gbfprintf, gbfclose, gbfopen, gbfgetstr, gbfile
+#include "grtcirc.h" // for RAD, gcdist, heading_true_degrees, radtometers
+#include "jeeps/gpsmath.h" // for GPS_Lookup_Datum_Index, GPS_Math_WGS84_To_Known_Datum_M
+#include "src/core/datetime.h" // for DateTime
+#include "src/core/logging.h" // for Warning, Fatal
+
+
+#define MYNAME "stmsdf"
+
+#define ALT(a) (a->altitude != unknown_alt) ? a->altitude : 0
+
+enum sdf_section_e {
+ sdf_unknown,
+ sdf_header,
+ sdf_points,
+ sdf_custom
+};
+
+static gbfile* fin, *fout;
+
+static int lineno;
+static int datum;
+static int filetype;
+static route_head* route;
+static QList<Waypoint*> trackpts;
+static QString rte_name;
+static QString rte_desc;
+
+static const Waypoint* trkpt_out;
+static const route_head* trk_out;
+
+static double trkpt_dist;
+static double minalt, maxalt, maxspeed;
+static double this_distance, all_dist;
+static time_t this_time, all_time;
+static double all_asc, all_desc;
+static int this_index; /* from 1 to ... */
+static int all_points;
+static int this_points;
+static int saved_points;
+static time_t start_time;
+static bool this_valid;
+static short_handle short_h;
+
+#define route_index this_index
+#define track_index this_index
+#define all_route_points all_points
+#define all_track_points all_points
+#define route_points this_points
+#define track_points this_points
+#define saved_track_points saved_points
+#define this_route_valid this_valid
+
+/* placeholders for options */
+
+static char* opt_route_index;
+static int opt_route_index_value;
+
+static
+QVector<arglist_t> stmsdf_args = {
+ {
+ "index", &opt_route_index,
+ "Index of route (if more than one in source)", "1", ARGTYPE_INT, "1", nullptr, nullptr
+ },
+};
+
+
+/* ----------------------------------------------------------- */
+
+static void
+parse_header(char* line)
+{
+ char* str;
+ QString key;
+ const char* prod = nullptr;
+ int column = -1;
+
+ while ((str = csv_lineparse(line, "=", "", lineno))) {
+ line = nullptr;
+ column++;
+ QString qstr(str);
+ bool ok;
+
+ switch (column) {
+ case 0:
+ key = qstr.toUpper();
+ break;
+ case 1:
+ if (key == "DATUM") {
+ datum = GPS_Lookup_Datum_Index(str);
+ } else if (key == "FILEVERSION") {
+ int ver = qstr.toInt(&ok);
+ is_fatal(!ok || (ver != 1),
+ MYNAME ": This version '%d' is not yet supported. Please report!", ver);
+ } else if (key == "NAME") {
+ rte_name = str;
+ } else if (key == "NOTES") /* ToDo */;
+ else if (key == "SOURCE") {
+ rte_desc = str;
+ } else if (key == "TYPE") {
+ filetype = qstr.toInt(&ok);
+ if (!ok) {
+ fatal(FatalMsg() << MYNAME << "Unknown file type " << key);
+ }
+ switch (filetype) {
+ case 4: /* M9 TrackLog (Suunto Sail Manager) */
+ case 5: /* route */
+ case 28: /* X9 TrackLog (Suunto Trek Manager */
+ break;
+
+ // 2014-02-11: Added breaks after 78 and 79 as the author "obviously"
+ // meant to treat those as handled.
+ case 78:
+ prod = "S6 SkiChrono";
+ break;
+ case 79:
+ prod = "S6 Skilog";
+ break;
+
+ default:
+ if (prod == nullptr) {
+ prod = "unknown";
+ }
+ fatal(MYNAME ": Unsupported file type (%s, type %d)!\n", prod, filetype);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
+static bool
+track_sort_cb(const Waypoint* a, const Waypoint* b)
+{
+ return a->GetCreationTime() < b->GetCreationTime();
+}
+
+static void
+finalize_tracks()
+{
+ route_head* track = nullptr;
+ int trackno = 0;
+
+ if (trackpts.isEmpty()) {
+ return;
+ }
+
+ std::sort(trackpts.begin(), trackpts.end(), track_sort_cb);
+
+ foreach (Waypoint* wpt, trackpts) {
+ if (wpt->wpt_flags.fmt_use == 2) { /* log continued */
+ track = nullptr;
+ }
+ if (track == nullptr) {
+ track = new route_head;
+ track_add_head(track);
+ trackno++;
+ if (rte_name != nullptr) {
+ if (trackno > 1) {
+ track->rte_name = QString("%1 (%2)").arg(rte_name).arg(trackno);
+ } else {
+ track->rte_name = rte_name;
+ }
+ }
+ if (rte_desc != nullptr) {
+ track->rte_desc = rte_desc;
+ }
+ }
+ track_add_wpt(track, wpt);
+ if (wpt->wpt_flags.fmt_use == 1) { /* log pause */
+ track = nullptr;
+ }
+ wpt->wpt_flags.fmt_use = 0;
+ }
+
+ trackpts.clear();
+}
+
+static void
+parse_point(char *line) {
+ char *str;
+ int column = -1;
+ int what = -1; /* -1 = unknown, 0 = tp, 1 = mp, 2 = wp, 3 = ap */
+ Waypoint *wpt = nullptr;
+ QDate dt;
+ QTime tm;
+
+ while ((str = csv_lineparse(line, ",", "", lineno))) {
+
+ line = nullptr;
+ column++;
+ QString qstr(str);
+ bool ok(true);
+ // TODO: Several entries use a QString variant. This whole function should just parse it like that.
+
+ switch (column) {
+ case 0:
+ if (qstr == "\"TP\"") {
+ what = 0;
+ column++; /* skip name */
+ } else if (qstr == "\"MP\"") {
+ what = 1;
+ } else if (qstr == "\"WP\"") {
+ what = 2;
+ } else if (qstr == "\"AP\"") {
+ what = 3;
+ } else {
+ warning(MYNAME ": Unknown point type %s at line %d!\n", str, lineno);
+ return;
+ }
+ wpt = new Waypoint;
+ break;
+
+ case 1:
+ wpt->shortname = qstr.remove('\"');
+ if ((what == 2) || (what == 3)) {
+ column += 2; /* doesn't have date and time */
+ }
+ break;
+ case 2: {
+ // Date is in format dd.mm.yyyy
+ const auto v = qstr.split('.');
+
+ if (v.size() == 3) {
+ auto day = v[0].toInt();
+ auto month = v[1].toInt();
+ auto year = v[2].toInt();
+ dt = QDate(year, month, day);
+ } else {
+ fatal(FatalMsg() << MYNAME << "Invalid date" << qstr);
+ }
+ break;
+ }
+ case 3: {
+ // Time is hh:mm.ss - yes, colon and period.
+ const auto v = qstr.split(QRegularExpression("[.:]"));
+ if (v.size() == 3) {
+ auto hour = v[0].toInt();
+ auto min = v[1].toInt();
+ auto sec = v[2].toInt();
+ tm = QTime(hour, min, sec);
+ } else {
+ fatal(FatalMsg() << MYNAME << "Invalid Time" << qstr);
+ }
+ break;
+ }
+ case 4:
+ wpt->latitude = qstr.toDouble(&ok);
+ if (!ok) {
+ fatal(FatalMsg() << MYNAME << "Invalid latitude" << qstr);
+ }
+ break;
+ case 5:
+ wpt->longitude = qstr.toDouble(&ok);
+ if (!ok) {
+ fatal(FatalMsg() << MYNAME << "Invalid longitude" << qstr);
+ }
+ break;
+ case 6: {
+ // Not entirely sure if this is optional.
+ double alt = qstr.toDouble(&ok);
+ if (ok) {
+ wpt->altitude = alt;
+ }
+ }
+ break;
+ case 7: {
+ auto v = qstr.toFloat(&ok);
+ if (ok) {
+ if (what == 0) {
+ WAYPT_SET(wpt, speed, v * 3.6);
+ } else if (what == 3) {
+ WAYPT_SET(wpt, proximity, v);
+ wpt->notes = QString("Alarm point: radius=" + qstr);
+ }
+ }
+ break;
+ }
+ case 8:
+ if (what == 0) {
+ auto scourse = qstr.toFloat(&ok);
+ if (ok) {
+ WAYPT_SET(wpt, course, scourse);
+ }
+ }
+ break;
+ case 9:
+ case 10:
+ default:
+ break;
+ case 11:
+ if (wpt && what == 1) {
+ wpt->wpt_flags.fmt_use = qstr.toUInt(&ok); /* memory point type */
+ }
+ break;
+ }
+ }
+
+ if (dt.isValid() && tm.isValid()) {
+ wpt->SetCreationTime(QDateTime(dt, tm));
+ }
+
+ if (datum != DATUM_WGS84) {
+ double ht;
+ GPS_Math_WGS84_To_Known_Datum_M(wpt->latitude, wpt->longitude, 0,
+ &wpt->latitude, &wpt->longitude, &ht, datum);
+ }
+
+ switch (what) {
+ case 0:
+ case 1:
+ trackpts.append(wpt);
+ break;
+ case 2:
+ case 3:
+ if (route == nullptr) {
+ route = new route_head;
+ route_add_head(route);
+ }
+ route_add_wpt(route, wpt);
+ break;
+ default:
+ Warning() << MYNAME << "Invalid internal field type" << what;
+ }
+}
+
+/* ----------------------------------------------------------- */
+
+static void
+rd_init(const QString& fname)
+{
+ fin = gbfopen(fname, "r", MYNAME);
+
+ lineno = 0;
+ route = nullptr;
+ datum = DATUM_WGS84;
+ filetype = 28;
+ rte_name = rte_desc = QString();
+
+ trackpts.clear();
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(fin);
+ rte_name = QString();
+ rte_desc = QString();
+}
+
+static void
+data_read()
+{
+ char* buf;
+ sdf_section_e section = sdf_unknown;
+
+ while ((buf = gbfgetstr(fin))) {
+ char* cin = lrtrim(buf);
+ if ((lineno++ == 0) && fin->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+
+ if (*cin == '\0') {
+ continue;
+ }
+
+ if (*cin == '[') {
+ char* cend = strchr(++cin, ']');
+
+ if (cend != nullptr) {
+ *cend = '\0';
+ cin = lrtrim(cin);
+ }
+ if ((*cin == '\0') || (cend == nullptr)) {
+ fatal(MYNAME ": Invalid section header!\n");
+ }
+
+ if (case_ignore_strcmp(cin, "HEADER") == 0) {
+ section = sdf_header;
+ } else if (case_ignore_strcmp(cin, "POINTS") == 0) {
+ section = sdf_points;
+ } else if (case_ignore_strncmp(cin, "CUSTOM", 6) == 0) {
+ section = sdf_custom;
+ } else {
+ warning(MYNAME ": Unknown section \"%s\". Please report.\n", cin);
+ section = sdf_unknown;
+ }
+ } else switch (section) {
+ case sdf_header:
+ parse_header(cin);
+ break;
+ case sdf_points:
+ parse_point(cin);
+ break;
+ case sdf_custom:
+ case sdf_unknown:
+ break;
+ }
+ }
+ finalize_tracks(); /* memory points can be at the end of all trackpoints */
+}
+
+
+static void
+calculate(const Waypoint* wpt, double* dist, double* speed, double* course,
+ double* asc, double* desc)
+{
+ if (trkpt_out != nullptr) {
+ *course = heading_true_degrees(
+ RAD(trkpt_out->latitude), RAD(trkpt_out->longitude),
+ RAD(wpt->latitude), RAD(wpt->longitude));
+
+ *dist = radtometers(gcdist(
+ RAD(trkpt_out->latitude), RAD(trkpt_out->longitude),
+ RAD(wpt->latitude), RAD(wpt->longitude)));
+ if (*dist < 0.1) {
+ *dist = 0; /* calc. diffs on 32- and 64-bit hosts */
+ }
+
+ time_t time = wpt->creation_time.toTime_t() - trkpt_out->GetCreationTime().toTime_t();
+ if (time == 0) {
+ *speed = 0;
+ } else {
+ *speed = *dist / (double)time;
+ }
+
+ if (asc && desc && (trkpt_out->altitude != unknown_alt) && (wpt->altitude != unknown_alt)) {
+ double dh = wpt->altitude - trkpt_out->altitude;
+ if (dh > 0) {
+ *asc += dh;
+ } else {
+ *desc -= dh;
+ }
+ }
+ } else {
+ *speed = 0;
+ *dist = 0;
+ *course = 0;
+ if (asc) {
+ *asc = 0;
+ }
+ if (desc) {
+ *desc = 0;
+ }
+ }
+ if WAYPT_HAS(wpt, speed) {
+ *speed = wpt->speed / 3.6; /* -> meters per second */
+ }
+ if WAYPT_HAS(wpt, course) {
+ *course = wpt->course;
+ }
+
+}
+
+/* pre-calculation callbacks */
+
+static void
+any_hdr_calc_cb(const route_head* trk)
+{
+
+ trkpt_out = nullptr;
+ this_distance = 0;
+ this_time = 0;
+ this_points = 0;
+
+ this_index++;
+ this_valid = ((opt_route_index_value < 1) || (opt_route_index_value == this_index));
+ if (! this_valid) {
+ return;
+ }
+
+ if (rte_name.isEmpty() && !trk->rte_name.isEmpty()) {
+ rte_name = trk->rte_name;
+ rte_desc = trk->rte_desc;
+ }
+
+ trk_out = trk;
+}
+
+static void
+any_waypt_calc_cb(const Waypoint* wpt)
+{
+ double speed, course, dist;
+
+ /* we can only write ONE route */
+ if (! this_valid) {
+ return;
+ }
+
+ if ((all_points == 0) && (this_points == 0)) {
+ start_time = wpt->GetCreationTime().toTime_t();
+ }
+
+ this_points++;
+
+ if ((wpt->altitude != unknown_alt) && (wpt->altitude < minalt)) {
+ minalt = wpt->altitude;
+ }
+ if ((wpt->altitude != unknown_alt) && (wpt->altitude > maxalt)) {
+ maxalt = wpt->altitude;
+ }
+ calculate(wpt, &dist, &speed, &course, &all_asc, &all_desc);
+ if (speed > maxspeed) {
+ maxspeed = speed;
+ }
+
+ this_distance = this_distance + dist;
+ if (trkpt_out != nullptr) {
+ this_time += (wpt->GetCreationTime().toTime_t() - trkpt_out->GetCreationTime().toTime_t());
+ }
+
+ trkpt_out = wpt;
+}
+
+static void
+any_tlr_calc_cb(const route_head*)
+{
+ if (! this_valid) {
+ return;
+ }
+
+ all_dist += this_distance;
+ all_time += this_time;
+ all_points += this_points;
+}
+
+/* write callbacks */
+
+static void
+track_disp_hdr_cb(const route_head* trk)
+{
+ track_index++;
+ track_points = 0;
+ trk_out = trk;
+ trkpt_out = nullptr;
+}
+
+
+static void
+track_disp_wpt_cb(const Waypoint* wpt)
+{
+ struct tm tm;
+ char tbuf[32];
+ double course, speed, dist;
+ int flag = 0;
+
+ track_points++;
+ all_track_points++;
+
+ time_t ct = wpt->GetCreationTime().toTime_t();
+ tm = *localtime(&ct);
+ strftime(tbuf, sizeof(tbuf), "%d.%m.%Y,%H:%M.%S", &tm);
+
+ calculate(wpt, &dist, &speed, &course, nullptr, nullptr);
+ trkpt_dist = trkpt_dist + dist;
+
+ if (track_points == trk_out->rte_waypt_ct()) { /* I'm the last in that list */
+ if (all_track_points != saved_track_points) { /* but not the overall latest */
+ flag = 1;
+ }
+ } else if (track_points == 1) { /* I'm the first in that list */
+ if (all_track_points > 1) { /* but not the first ever seen */
+ flag = 2;
+ }
+ }
+
+ if (flag == 1) {
+ QString name = wpt->shortname;
+ if (name == nullptr) {
+ name = "Log paused";
+ }
+ gbfprintf(fout, "\"MP\",\"%s\"", CSTR(name));
+ } else if (flag == 2) {
+ QString name = wpt->shortname;
+ if (name == nullptr) {
+ name = "Log continued";
+ }
+ gbfprintf(fout, "\"MP\",\"%s\"", CSTR(name));
+ } else {
+ gbfprintf(fout, "\"TP\"");
+ }
+
+ gbfprintf(fout, ",%s,%.6lf,%.6lf,%.f,%.2f",
+ tbuf,
+ wpt->latitude, wpt->longitude, ALT(wpt), speed);
+ if (flag) {
+ gbfprintf(fout, ",0,0,%d", flag); /* press, temperature, memory point type */
+ } else {
+ gbfprintf(fout, ",%.1f", course);
+ }
+
+ if (trkpt_dist != 0) {
+ gbfprintf(fout, ",%.6f\n", trkpt_dist);
+ } else {
+ gbfprintf(fout, ",0\n");
+ }
+
+ trkpt_out = wpt;
+}
+
+static void
+track_disp_tlr_cb(const route_head*)
+{
+ trkpt_out = nullptr;
+}
+
+static void
+route_disp_hdr_cb(const route_head*)
+{
+ route_index++;
+ this_route_valid = ((opt_route_index_value < 1) || (opt_route_index_value == track_index));
+}
+
+static void
+route_disp_wpt_cb(const Waypoint* wpt)
+{
+ if (this_route_valid) {
+ QString sn;
+
+ if (global_opts.synthesize_shortnames) {
+ sn = mkshort_from_wpt(short_h, wpt);
+ } else {
+ sn = mkshort(short_h, wpt->shortname);
+ }
+ gbfprintf(fout, "\"WP\",\"%s\",%.8lf,%.8lf,%.f\n",
+ CSTR(sn), wpt->latitude, wpt->longitude, ALT(wpt));
+ }
+}
+
+static void
+track_disp_custom_cb(const Waypoint* wpt)
+{
+ if (wpt->GetCreationTime().isValid() && (wpt->altitude != unknown_alt)) {
+ gbfprintf(fout, "%d,%.f\n", (int)(wpt->GetCreationTime().toTime_t() - start_time), wpt->altitude);
+ }
+}
+
+static void
+wr_init(const QString& fname)
+{
+ fout = gbfopen(fname, "w", MYNAME);
+ short_h = mkshort_new_handle();
+}
+
+static void
+wr_deinit()
+{
+ mkshort_del_handle(&short_h);
+ gbfclose(fout);
+}
+
+static void
+data_write()
+{
+ gbfprintf(fout, "[HEADER]\n");
+ gbfprintf(fout, "FILEVERSION=1\n");
+ gbfprintf(fout, "SOURCE=FILE\n");
+ gbfprintf(fout, "DATUM=WGS84\n");
+
+ rte_name = QString();
+ rte_desc = QString();
+ trkpt_out = nullptr;
+ opt_route_index_value = -1; /* take all tracks from data pool */
+ track_index = 0;
+ minalt = -unknown_alt;
+ maxalt = unknown_alt;
+ maxspeed = 0;
+ all_dist = 0;
+ all_time = 0;
+ all_asc = 0;
+ all_desc = 0;
+ all_points = 0;
+ start_time = 0;
+
+ setshort_length(short_h, 100);
+ setshort_badchars(short_h, "\r\n");
+ setshort_mustupper(short_h, 0);
+ setshort_mustuniq(short_h, 0);
+ setshort_whitespace_ok(short_h, 1);
+ setshort_repeating_whitespace_ok(short_h, 1);
+
+ switch (global_opts.objective) {
+ case wptdata:
+ case unknown_gpsdata:
+ break;
+
+ case rtedata:
+ gbfprintf(fout, "TYPE=5\n");
+
+ opt_route_index_value = atoi(opt_route_index);
+ route_disp_all(any_hdr_calc_cb, any_tlr_calc_cb, any_waypt_calc_cb);
+ gbfprintf(fout, "DISTANCE=%.f\n", all_dist);
+ if (!rte_name.isEmpty()) {
+ gbfprintf(fout, "NAME=%s\n", CSTR(rte_name));
+ }
+ gbfprintf(fout, "[POINTS]\n");
+ if (route_points > 0) {
+ track_index = 0;
+ route_disp_all(route_disp_hdr_cb, nullptr, route_disp_wpt_cb);
+ }
+ break;
+
+ case trkdata:
+ gbfprintf(fout, "TYPE=28\n");
+
+ track_disp_all(any_hdr_calc_cb, any_tlr_calc_cb, any_waypt_calc_cb);
+ if (all_track_points > 0) {
+ if (!rte_name.isEmpty()) {
+ gbfprintf(fout, "NAME=%s\n", CSTR(rte_name));
+ }
+ if (minalt != -unknown_alt) {
+ gbfprintf(fout, "MINALT=%.f\n", minalt);
+ }
+ if (maxalt != unknown_alt) {
+ gbfprintf(fout, "MAXALT=%.f\n", maxalt);
+ }
+ gbfprintf(fout, "MAXSPEED=%.2f\n", maxspeed);
+ gbfprintf(fout, "DISTANCE=%.f\n", all_dist);
+ gbfprintf(fout, "DURATION=%lu\n", all_time);
+// gbfprintf(fout, "TOTASC=%.f\n", all_asc);
+// gbfprintf(fout, "TOTDSC=%.f\n", all_desc);
+ if (start_time) {
+ struct tm tm;
+ char tbuf[32];
+
+ tm = *localtime(&start_time);
+ strftime(tbuf, sizeof(tbuf), "%d.%m.%Y %H:%M.%S", &tm);
+ gbfprintf(fout, "DATE=%s\n", tbuf);
+ }
+ if (all_time) {
+ gbfprintf(fout, "AVGSPEED=%.2f\n", all_dist / (double)all_time);
+ }
+ }
+ gbfprintf(fout, "[POINTS]\n");
+ if (all_track_points > 0) {
+
+ trkpt_dist = 0;
+ saved_track_points = all_track_points;
+ all_track_points = 0;
+ track_disp_all(track_disp_hdr_cb, track_disp_tlr_cb, track_disp_wpt_cb);
+
+ if (start_time) {
+ gbfprintf(fout, "[CUSTOM1]\n");
+ track_index = 0;
+ track_disp_all(nullptr, nullptr, track_disp_custom_cb);
+ }
+ }
+ break;
+ case posndata:
+ fatal(MYNAME ": Realtime positioning not supported.\n");
+ break;
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+ff_vecs_t stmsdf_vecs = {
+ ff_type_file,
+ {
+ ff_cap_none,
+ (ff_cap)(ff_cap_read | ff_cap_write),
+ (ff_cap)(ff_cap_read | ff_cap_write)
+ },
+ rd_init,
+ wr_init,
+ rd_deinit,
+ wr_deinit,
+ data_read,
+ data_write,
+ nullptr,
+ &stmsdf_args,
+ CET_CHARSET_MS_ANSI, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
+
+/* ================================================================== */
+
+#endif /* CSVFMTS_ENABLED */
+
--- /dev/null
+/*
+
+ Support for "Suunto Trek Manager" (STM) WaypointPlus files,
+ see homepage "http://www.suunto.fi" for more details,
+
+ Copyright (C) 2005,2007 Olaf Klein, o.b.klein@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <cstdio> // for sscanf, snprintf
+#include <cstdlib> // for atof, atoi
+#include <cstring> // for memset
+#include <ctime> // for tm
+
+#include <QDateTime> // for QDateTime
+#include <QString> // for QString
+#include <QTime> // for QTime
+#include <QVector> // for QVector
+
+#include "defs.h"
+#include "cet_util.h" // for cet_convert_init
+#include "csv_util.h" // for csv_lineparse
+#include "gbfile.h" // for gbfprintf, gbfclose, gbfgetstr, gbfopen, gbfile, gbfputs
+#include "src/core/datetime.h" // for DateTime
+
+
+#if CSVFMTS_ENABLED
+
+static gbfile* fin, *fout;
+static route_head* track, *route;
+static Waypoint* wpt;
+static short_handle short_h;
+
+#define MYNAME "STMwpp"
+
+#define STM_NOTHING 0
+#define STM_WAYPT 1
+#define STM_TRKPT 2
+#define STM_RTEPT 3
+
+static int track_index;
+static int track_num;
+static int what;
+
+static char* index_opt = nullptr;
+
+static
+QVector<arglist_t> stmwpp_args = {
+ {
+ "index", &index_opt, "Index of route/track to write (if more than one in source)",
+ nullptr, ARGTYPE_INT, "1", nullptr, nullptr
+ },
+};
+
+
+static void
+stmwpp_rd_init(const QString& fname)
+{
+ fin = gbfopen(fname, "rb", MYNAME);
+ track = nullptr;
+ route = nullptr;
+ wpt = nullptr;
+}
+
+static void
+stmwpp_rd_deinit()
+{
+ gbfclose(fin);
+}
+
+static void
+stmwpp_data_read()
+{
+ int line = 0;
+
+ what = STM_NOTHING;
+ char* buff = gbfgetstr(fin);
+ buff = (buff == nullptr) ? (char*) "" : buff;
+
+ if (case_ignore_strncmp(buff, "Datum,WGS 84,WGS 84,", 20) != 0) {
+ fatal(MYNAME ": Invalid GPS datum or not \"WaypointPlus\"\" file!\n");
+ }
+
+ while ((buff = gbfgetstr(fin))) {
+ char* c;
+ int column = -1;
+ struct tm time;
+
+ if ((line++ == 0) && fin->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+
+ buff = lrtrim(buff);
+ if (*buff == '\0') {
+ continue;
+ }
+
+ wpt = nullptr;
+ memset(&time, 0, sizeof(time));
+ int milliseconds = 0;
+
+ while ((c = csv_lineparse(buff, ",", "", column++))) {
+ int new_what;
+
+ buff = nullptr;
+
+ switch (column) {
+ case 0:
+ if (case_ignore_strcmp(c, "WP") == 0) {
+ new_what = STM_WAYPT;
+ } else if (case_ignore_strcmp(c, "TP") == 0) {
+ new_what = STM_TRKPT;
+ } else {
+ fatal(MYNAME ": Unknown feature \"%s\"!\n", c);
+ }
+
+ if ((what != STM_NOTHING) && (new_what != what)) {
+ fatal(MYNAME ": Only one feature (route or track) is supported by STM!\n");
+ }
+
+ what = new_what;
+ wpt = new Waypoint;
+ break;
+
+ case 1:
+ if (what == STM_TRKPT) {
+ column++; /* no name -> skip column two */
+ }
+ break;
+
+ case 2:
+ wpt->shortname = QString::fromLatin1(c);
+ break;
+
+ case 3:
+ wpt->latitude = atof(c);
+ break;
+
+ case 4:
+ wpt->longitude = atof(c);
+ break;
+
+ case 5:
+ sscanf(c, "%d/%d/%d", &time.tm_mon, &time.tm_mday, &time.tm_year);
+ break;
+
+ case 6:
+ sscanf(c, "%d:%d:%d.%d", &time.tm_hour, &time.tm_min, &time.tm_sec, &milliseconds);
+ /* makes sense only for recorded trackpoints */
+ if (what != STM_TRKPT) {
+ milliseconds = 0;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (wpt != nullptr) {
+ time.tm_year -= 1900;
+ time.tm_mon--;
+ wpt->SetCreationTime(mkgmtime(&time), milliseconds);
+
+ switch (what) {
+ case STM_WAYPT:
+ waypt_add(wpt);
+ if (global_opts.objective == rtedata) {
+ if (route == nullptr) {
+ route = new route_head;
+ route_add_head(route);
+ }
+ route_add_wpt(route, new Waypoint(*wpt));
+ }
+ break;
+
+ case STM_TRKPT:
+ if (track == nullptr) {
+ track = new route_head;
+ track_add_head(track);
+ }
+ track_add_wpt(track, wpt);
+ break;
+ }
+ wpt = nullptr;
+ }
+ }
+}
+
+static void
+stmwpp_rw_init(const QString& fname)
+{
+ fout = gbfopen(fname, "wb", MYNAME);
+ short_h = mkshort_new_handle();
+}
+
+static void
+stmwpp_rw_deinit()
+{
+ mkshort_del_handle(&short_h);
+ gbfclose(fout);
+}
+
+static void
+stmwpp_track_hdr(const route_head*)
+{
+ track_num++;
+}
+
+static void
+stmwpp_write_double(const double val)
+{
+ char buff[64];
+
+ char* c = buff + snprintf(buff, sizeof(buff), "%3.7f", val);
+ while (*--c == '0') {
+ *c = '\0';
+ }
+ if (*c == '.') {
+ *++c = '0';
+ }
+ gbfprintf(fout, "%s,", buff);
+}
+
+static void
+stmwpp_waypt_cb(const Waypoint* waypoint)
+{
+ if (track_index != track_num) {
+ return;
+ }
+
+ QString sn;
+ switch (what) {
+
+ case STM_WAYPT:
+ case STM_RTEPT:
+ if (global_opts.synthesize_shortnames) {
+ sn = mkshort_from_wpt(short_h, waypoint);
+ } else {
+ sn = mkshort(short_h, waypoint->shortname);
+ }
+ gbfprintf(fout, "WP,D,%s,", CSTRc(sn));
+ break;
+
+ case STM_TRKPT:
+ gbfprintf(fout, "TP,D,");
+ break;
+ }
+ stmwpp_write_double(waypoint->latitude);
+ stmwpp_write_double(waypoint->longitude);
+ QString datetime = waypoint->GetCreationTime().toUTC().toString("MM/dd/yyyy,HH:mm:ss");
+ gbfputs(datetime, fout);
+ switch (what) {
+ case STM_WAYPT:
+ case STM_RTEPT:
+ gbfprintf(fout, ".%02d", 0);
+ break;
+ case STM_TRKPT:
+ gbfprintf(fout, ".%03d", waypoint->GetCreationTime().time().msec());
+ break;
+ }
+ gbfprintf(fout, ",\r\n");
+}
+
+static void
+stmwpp_data_write()
+{
+ setshort_length(short_h, 100);
+ setshort_badchars(short_h, ",\r\n");
+ setshort_mustupper(short_h, 0);
+ setshort_mustuniq(short_h, 0);
+ setshort_whitespace_ok(short_h, 1);
+ setshort_repeating_whitespace_ok(short_h, 1);
+
+ track_num = 0;
+ if (index_opt != nullptr) {
+ track_index = atoi(index_opt);
+ } else {
+ track_index = 1;
+ }
+
+ gbfprintf(fout, "Datum,WGS 84,WGS 84,0,0,0,0,0\r\n");
+
+ switch (global_opts.objective) {
+ case wptdata:
+ case unknown_gpsdata:
+ what = STM_WAYPT;
+ track_index = track_num; /* disable filter */
+ setshort_defname(short_h, "WPT");
+ waypt_disp_all(stmwpp_waypt_cb);
+ break;
+ case rtedata:
+ what = STM_RTEPT;
+ setshort_defname(short_h, "RPT");
+ route_disp_all(stmwpp_track_hdr, nullptr, stmwpp_waypt_cb);
+ break;
+ case trkdata:
+ what = STM_TRKPT;
+ track_disp_all(stmwpp_track_hdr, nullptr, stmwpp_waypt_cb);
+ break;
+ case posndata:
+ fatal(MYNAME ": Realtime positioning not supported.\n");
+ break;
+ }
+}
+
+ff_vecs_t stmwpp_vecs = {
+ ff_type_file,
+ FF_CAP_RW_ALL,
+ stmwpp_rd_init,
+ stmwpp_rw_init,
+ stmwpp_rd_deinit,
+ stmwpp_rw_deinit,
+ stmwpp_data_read,
+ stmwpp_data_write,
+ nullptr,
+ &stmwpp_args,
+ CET_CHARSET_MS_ANSI, 0
+ , NULL_POS_OPS,
+ nullptr
+};
+
+#endif /* CSVFMTS_ENABLED */
+
--- /dev/null
+/*
+ Access to U.S. Census Bureau "tiger" format.
+
+ Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include "defs.h"
+#include "cet_util.h"
+#include "csv_util.h"
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+
+static gbfile* file_in, *file_out;
+static short_handle mkshort_handle;
+static short_handle mkshort_whandle;
+
+#define MYNAME "GPSUTIL"
+
+static double maxlat, maxlon, minlat, minlon;
+static int rec_cnt;
+static char* nolabels = nullptr;
+static char* genurl = nullptr;
+static char* suppresswhite = nullptr;
+static char* iconismarker = nullptr;
+static char* snlen = nullptr;
+
+static char* margin = nullptr;
+static char* xpixels = nullptr;
+static char* ypixels = nullptr;
+static char* oldthresh = nullptr;
+static char* oldmarker = nullptr;
+static char* newmarker = nullptr;
+static char* unfoundmarker = nullptr;
+
+static int short_length;
+static double thresh_days;
+
+/*
+ * The code bracketed by CLICKMAP is to generate clickable image maps
+ * for a web browser. It's functional, but is missing the math to do
+ * the projection transformations. Some trig geek can finish that.
+ */
+#if CLICKMAP
+static gbfile* linkf;
+static char* clickmap = NULL;
+#endif
+
+
+static
+QVector<arglist_t> tiger_args = {
+ {
+ "nolabels", &nolabels, "Suppress labels on generated pins",
+ nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "genurl", &genurl, "Generate file with lat/lon for centering map",
+ nullptr, ARGTYPE_OUTFILE, ARG_NOMINMAX, nullptr
+ },
+ {
+ "margin", &margin, "Margin for map. Degrees or percentage",
+ "15%", ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr
+ },
+ {
+ "snlen", &snlen, "Max shortname length when used with -s",
+ "10", ARGTYPE_INT, "1", nullptr, nullptr
+ },
+ {
+ "oldthresh", &oldthresh,
+ "Days after which points are considered old",
+ "14", ARGTYPE_INT, ARG_NOMINMAX, nullptr
+ },
+ {
+ "oldmarker", &oldmarker, "Marker type for old points",
+ "redpin", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "newmarker", &newmarker, "Marker type for new points",
+ "greenpin", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "suppresswhite", &suppresswhite,
+ "Suppress whitespace in generated shortnames",
+ nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "unfoundmarker", &unfoundmarker, "Marker type for unfound points",
+ "bluepin", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "xpixels", &xpixels, "Width in pixels of map",
+ "768", ARGTYPE_INT, ARG_NOMINMAX, nullptr
+ },
+ {
+ "ypixels", &ypixels, "Height in pixels of map",
+ "768", ARGTYPE_INT, ARG_NOMINMAX, nullptr
+ },
+ {
+ "iconismarker", &iconismarker,
+ "The icon description is already the marker", nullptr,
+ ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+#if CLICKMAP
+ {
+ "clickmap", &clickmap, "Generate Clickable map web page",
+ NULL, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+#endif
+};
+
+
+static void
+rd_init(const QString& fname)
+{
+ file_in = gbfopen(fname, "rb", MYNAME);
+ mkshort_handle = mkshort_new_handle();
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(file_in);
+ mkshort_del_handle(&mkshort_handle);
+}
+
+static void
+wr_init(const QString& fname)
+{
+ file_out = gbfopen(fname, "w", MYNAME);
+ thresh_days = strtod(oldthresh, nullptr);
+}
+
+static void
+wr_deinit()
+{
+ gbfclose(file_out);
+}
+
+static void
+data_read()
+{
+ double lat,lon;
+ char desc[101];
+ char icon[101];
+ char* ibuf;
+ int line = 0;
+
+ while ((ibuf = gbfgetstr(file_in))) {
+ if ((line++ == 0) && file_in->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+ if (sscanf(ibuf, "%lf,%lf:%100[^:]:%100[^\n]",
+ &lon, &lat, icon, desc)) {
+ auto* wpt_tmp = new Waypoint;
+
+ wpt_tmp->longitude = lon;
+ wpt_tmp->latitude = lat;
+ wpt_tmp->description = desc;
+ wpt_tmp->shortname = mkshort(mkshort_handle, QString(desc));
+
+ waypt_add(wpt_tmp);
+ }
+ }
+}
+
+static void
+tiger_disp(const Waypoint* wpt)
+{
+ QString pin;
+ double lat = wpt->latitude;
+ double lon = wpt->longitude;
+
+ if (iconismarker) {
+ pin = wpt->icon_descr;
+ } else if (wpt->icon_descr.contains("-unfound")) {
+ pin = unfoundmarker;
+ } else if (wpt->GetCreationTime() > current_time().addSecs(-3600 * 24 * thresh_days)) {
+ pin = newmarker;
+ } else {
+ pin = oldmarker;
+ }
+
+ if (genurl) {
+ if (lat > maxlat) {
+ maxlat = lat;
+ }
+ if (lon > maxlon) {
+ maxlon = lon;
+ }
+ if (lat < minlat) {
+ minlat = lat;
+ }
+ if (lon < minlon) {
+ minlon = lon;
+ }
+ }
+
+ gbfprintf(file_out, "%f,%f:%s", lon, lat, CSTR(pin));
+ if (!nolabels) {
+ QString temp;
+ QString desc = csv_stringclean(wpt->description, ":");
+ if (global_opts.synthesize_shortnames) {
+ temp = desc;
+ desc = mkshort(mkshort_whandle, desc);
+ }
+ gbfprintf(file_out, ":%s", CSTR(desc));
+ if (temp != nullptr) {
+ desc = temp;
+ }
+ }
+ gbfprintf(file_out, "\n");
+}
+
+#if CLICKMAP
+static void
+map_plot(const Waypoint* wpt)
+{
+ static int x,y;
+
+ /* Replace with real math. */
+ x+=10;
+ y+=10;
+
+ gbfprintf(linkf, "<area shape=\"circle\" coords=\"%d,%d,7\" href=\"%s\" alt=\"%s\"\n", x, y, wpt->url, wpt->description);
+}
+#endif /* CLICKMAP */
+
+static double
+dscale(double distance)
+{
+ /*
+ * If we have any specified margin options factor those in now.
+ * A additional little boundary is helpful because Tiger always
+ * puts the pin above the actual coord and if we don't pad the
+ * top will be clipped. It also makes the maps more useful to
+ * have a little bit of context around the pins on the border.
+ */
+
+ if (strchr(margin, '%')) {
+ return distance + strtod(margin, nullptr) / 100.0 * distance;
+ } else {
+ return strtod(margin, nullptr) + distance;
+ }
+}
+
+static void
+data_write()
+{
+ maxlat = -9999.0;
+ maxlon = -9999.0;
+ minlat = 9999.0;
+ minlon = 9999.0;
+ rec_cnt = 0;
+
+ short_length = atoi(snlen);
+ mkshort_whandle = mkshort_new_handle();
+
+ if (suppresswhite) {
+ setshort_whitespace_ok(mkshort_whandle, 0);
+ }
+
+ setshort_length(mkshort_whandle, short_length);
+
+ gbfprintf(file_out, "#tms-marker\n");
+ waypt_disp_all(tiger_disp);
+
+ if (genurl) {
+ gbfile* urlf = gbfopen(genurl, "w", MYNAME);
+ double latsz = fabs(maxlat - minlat);
+ double lonsz = fabs(maxlon - minlon);
+
+ /*
+ * Center the map along X and Y axis the midpoint of
+ * our min and max coords each way.
+ */
+ gbfprintf(urlf, "lat=%f&lon=%f&ht=%f&wid=%f",
+ minlat + (latsz/2.0),
+ minlon + (lonsz/2.0),
+ dscale(latsz),
+ dscale(lonsz));
+
+ gbfprintf(urlf, "&iwd=%s&iht=%s", xpixels, ypixels);
+ gbfclose(urlf);
+#if CLICKMAP
+ if (clickmap) {
+ linkf = gbfopen(clickmap, "w", MYNAME);
+ gbfprintf(linkf, "<map name=\"map\">\n");
+ waypt_disp_all(map_plot);
+ gbfprintf(linkf, "</map>\n");
+ gbfclose(linkf);
+ linkf = NULL;
+ }
+#endif
+ }
+
+ mkshort_del_handle(&mkshort_whandle);
+}
+
+
+ff_vecs_t tiger_vecs = {
+ ff_type_file,
+ FF_CAP_RW_WPT,
+ rd_init,
+ wr_init,
+ rd_deinit,
+ wr_deinit,
+ data_read,
+ data_write,
+ nullptr,
+ &tiger_args,
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+
+ Support for VidaOne GPS for Pocket PC (.gpb) files
+
+ Copyright (C) 2008 Olaf Klein, o.b.klein@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+/*
+ Simple layout:
+
+struct
+{
+ double dLatitude
+ double dLongitude
+ float fReserved
+};
+*/
+
+#include "defs.h"
+#include <cmath>
+#include <cstdlib>
+
+#define MYNAME "vidaone"
+
+#define VIDAONE_VER "ver"
+
+static char* vidaone_opt_ver;
+static int vidaone_ver;
+
+static
+QVector<arglist_t> vidaone_args = {
+ {
+ VIDAONE_VER, &vidaone_opt_ver,
+ "Version of VidaOne file to read or write (1 or 2)",
+ "1", ARGTYPE_INT, "1", "2", nullptr
+ },
+};
+
+static gbfile* fin, *fout;
+
+/*******************************************************************************
+* %%% global callbacks called by gpsbabel main process %%% *
+*******************************************************************************/
+
+static void
+vidaone_rd_init(const QString& fname)
+{
+ vidaone_ver = atoi(vidaone_opt_ver);
+ fin = gbfopen(fname, "rb", MYNAME);
+}
+
+static void
+vidaone_rd_deinit()
+{
+ gbfclose(fin);
+}
+
+static void
+vidaone_read()
+{
+ route_head* trk = nullptr;
+
+ while (! gbfeof(fin)) {
+ auto* wpt = new Waypoint;
+
+ wpt->latitude = gbfgetdbl(fin);
+ wpt->longitude = gbfgetdbl(fin);
+ if (vidaone_ver >= 2) {
+ wpt->altitude = gbfgetflt(fin);
+ }
+ (void) gbfgetflt(fin);
+
+ /* Only one basic check of data integrity */
+ if ((fabs(wpt->latitude) > 90) || (fabs(wpt->longitude) > 180)) {
+ fatal(MYNAME ": Latitude and/or longitude out of range.\n");
+ }
+
+ if (!trk) {
+ trk = new route_head;
+ track_add_head(trk);
+ }
+
+ track_add_wpt(trk, wpt);
+ }
+}
+
+static void
+vidaone_wr_init(const QString& fname)
+{
+ vidaone_ver = atoi(vidaone_opt_ver);
+ fout = gbfopen(fname, "wb", MYNAME);
+}
+
+static void
+vidaone_wr_deinit()
+{
+ gbfclose(fout);
+}
+
+static void
+vidaone_trkpt(const Waypoint* wpt)
+{
+ gbfputdbl(wpt->latitude, fout);
+ gbfputdbl(wpt->longitude, fout);
+ if (vidaone_ver >= 2) {
+ gbfputflt(wpt->altitude, fout);
+ }
+ gbfputflt(0, fout);
+}
+
+static void
+vidaone_write()
+{
+ track_disp_all(nullptr, nullptr, vidaone_trkpt);
+}
+
+/**************************************************************************/
+
+ff_vecs_t vidaone_vecs = {
+ ff_type_file,
+ {
+ ff_cap_none /* waypoints */,
+ (ff_cap)(ff_cap_read | ff_cap_write) /* tracks */,
+ ff_cap_none /* routes */
+ },
+ vidaone_rd_init,
+ vidaone_wr_init,
+ vidaone_rd_deinit,
+ vidaone_wr_deinit,
+ vidaone_read,
+ vidaone_write,
+ nullptr,
+ &vidaone_args,
+ CET_CHARSET_UTF8, 1
+ , NULL_POS_OPS,
+ nullptr
+};
+
+/**************************************************************************/
--- /dev/null
+/*
+ Read Vito Navigator .SMT tracks
+
+ Copyright (C) 2005 Etienne TASSE
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include "defs.h"
+#include "grtcirc.h"
+#include <cerrno>
+#include <cmath>
+
+#define MYNAME "vitosmt"
+
+static gbfile* infile = nullptr;
+static gbfile* ofs =nullptr;
+static long count = 0;
+
+const long vitosmt_version = 2;
+const long vitosmt_subversion = 1000;
+const size_t vitosmt_headersize = 24;
+const size_t vitosmt_datasize = 64;
+
+static unsigned char*
+ReadRecord(gbfile* f, gbsize_t size)
+{
+ auto* result = (unsigned char*) xmalloc(size);
+
+ gbfread(result, size, 1, f);
+ return result;
+}
+
+static void
+WriteDouble(void* ptr, double d)
+{
+ unsigned char result[9]="\0\0\0\0\0\0\0\0";
+ le_write_double(result,d);
+ memcpy(ptr, result, 8);
+}
+
+
+static void
+rd_init(const QString& fname)
+{
+ infile = gbfopen_le(fname, "rb", MYNAME);
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(infile);
+}
+
+static void
+vitosmt_read()
+{
+ route_head* rte = nullptr;
+ int serial = 0;
+
+ /*
+ * 24 bytes header
+ */
+ long version = gbfgetint32(infile); /* 2 */
+ long subversion = gbfgetint32(infile); /* 1000 */
+ count = gbfgetint32(infile); /* n */
+ long check1 = gbfgetint32(infile); /* 0 */
+ long check2 = gbfgetint32(infile); /* not sure */
+ (void) check2; // silence warning.
+ long check3 = gbfgetint32(infile); /* n */
+
+ if (version!=vitosmt_version) {
+
+ fatal("%s (%d) reading file. Unsupported version %ld.%ld\n",
+ MYNAME, __LINE__, version, subversion);
+ }
+
+ if (subversion!=vitosmt_subversion) {
+ warning("%s (%d) reading file. Unsafe version %ld.%ld\n",
+ MYNAME, __LINE__, version, subversion);
+ }
+
+ if ((count!=check3) ||
+ (check1!=count-1) ||
+ (check3!=count)) {
+
+ fatal("%s (%d) reading file. Invalid file header\n",
+ MYNAME, __LINE__);
+
+ }
+
+ while (count) {
+ /*
+ * 64 bytes of data
+ */
+ if (gbfeof(infile)||gbferror(infile)) {
+ warning("%s (%d) reading file. Unexpected end of file %s\n",
+ MYNAME, __LINE__, strerror(errno));
+ break;
+ }
+ double latrad = gbfgetdbl(infile); /* WGS84 latitude in radians */
+ double lonrad = gbfgetdbl(infile); /* WGS84 longitude in radians */
+ double elev = gbfgetdbl(infile); /* elevation in meters */
+ unsigned char* timestamp = ReadRecord(infile,5); /* UTC time yr/mo/dy/hr/mi */
+ double seconds = gbfgetdbl(infile); /* seconds */
+ double speed = gbfgetdbl(infile); /* speed in knots */
+ double course = gbfgetdbl(infile); /* course in degrees */
+ double pdop = gbfgetdbl(infile); /* dilution of precision */
+ unsigned char gpsfix = gbfgetc(infile); /* fix type x08,x10, x20 */
+ unsigned char gpsvalid = gbfgetc(infile); /* fix is valid */
+ unsigned char gpssats = gbfgetc(infile); /* number of sats */
+
+ auto* wpt_tmp = new Waypoint;
+
+ wpt_tmp->latitude = DEG(latrad);
+ wpt_tmp->longitude = DEG(lonrad);
+ wpt_tmp->altitude = elev;
+
+ wpt_tmp->SetCreationTime(QDateTime(
+ QDate(timestamp[0] + 2000, timestamp[1], timestamp[2]),
+ QTime(timestamp[3], timestamp[4]),
+ Qt::UTC).addMSecs(lround(seconds*1000.0)));
+
+ wpt_tmp->shortname = QString::asprintf("WP%04d", ++serial);
+
+ WAYPT_SET(wpt_tmp, speed, KNOTS_TO_MPS(speed)); /* meters per second */
+ WAYPT_SET(wpt_tmp, course, course);
+ wpt_tmp->pdop = pdop;
+
+ /*
+ GPS Fix data
+ */
+ if (gpsvalid&0x7) {
+ if (gpsfix==0) {
+ wpt_tmp->fix =fix_none;
+ }
+ if (gpsfix&0x8) {
+ wpt_tmp->fix =fix_2d;
+ } else if (gpsfix&0x10) {
+ wpt_tmp->fix =fix_3d;
+ } else if (gpsfix&0x20) {
+ wpt_tmp->fix =fix_dgps;
+ } else {
+ wpt_tmp->fix =fix_unknown;
+ }
+
+ /* <sat> */
+ wpt_tmp->sat = gpssats;
+ } else {
+ wpt_tmp->fix =fix_unknown;
+ }
+
+ if (doing_wpts) { /* process as waypoints */
+ waypt_add(wpt_tmp);
+ } else if (doing_rtes) { /* process as route */
+ if (rte == nullptr) {
+ rte = new route_head;
+ route_add_head(rte);
+ }
+ route_add_wpt(rte, wpt_tmp);
+ } else { /* default track mode */
+ if (rte == nullptr) {
+ rte = new route_head;
+ track_add_head(rte);
+ }
+ track_add_wpt(rte, wpt_tmp);
+ }
+
+ xfree(timestamp);
+
+ count--;
+ }
+}
+
+static void
+wr_init(const QString& fname)
+{
+ warning(MYNAME " write: format is experimental and may crash Vito Navigator II.\n");
+ ofs = gbfopen_le(fname, "wb", MYNAME);
+}
+
+static void
+wr_deinit()
+{
+ gbfclose(ofs);
+
+}
+
+static void
+vitosmt_waypt_pr(const Waypoint* waypointp)
+{
+ size_t position =0;
+ double seconds =0;
+
+ ++count;
+ auto* workbuffer = (unsigned char*) xcalloc(vitosmt_datasize,1);
+
+ WriteDouble(&workbuffer[position], RAD(waypointp->latitude));
+ position += sizeof(double);
+ WriteDouble(&workbuffer[position], RAD(waypointp->longitude));
+ position += sizeof(double);
+ if (waypointp->altitude-1 > unknown_alt) {
+ WriteDouble(&workbuffer[position], waypointp->altitude);
+ }
+ position += sizeof(double);
+ QDate date(waypointp->GetCreationTime().date());
+ QTime time(waypointp->GetCreationTime().time());
+ workbuffer[position++] = date.year()-100;
+ workbuffer[position++] = date.month();
+ workbuffer[position++] = date.day();
+ workbuffer[position++] = time.hour();
+ workbuffer[position++] = time.minute();
+
+ WriteDouble(&workbuffer[position], seconds);
+ position += sizeof(double);
+
+ /* speed */
+ if (waypointp->speed>0) {
+ WriteDouble(&workbuffer[position], MPS_TO_MPH(waypointp->speed));
+ }
+ position += sizeof(double);
+
+ /* course */
+ if ((waypointp->course>=-360.0)&&(waypointp->course<=360.0)) {
+ WriteDouble(&workbuffer[position], waypointp->course);
+ }
+ position += sizeof(double);
+
+ /* pdop */
+ if (waypointp->pdop>0) {
+ WriteDouble(&workbuffer[position], waypointp->pdop);
+ }
+ position += sizeof(double);
+
+
+ /* fix type */
+ switch (waypointp->fix) {
+ case fix_2d:
+ workbuffer[position++] = 0x08;
+ break;
+ case fix_3d:
+ workbuffer[position++] = 0x10;
+ break;
+ case fix_dgps:
+ workbuffer[position++] = 0x20;
+ break;
+ default:
+ workbuffer[position++] = 0;
+ break;
+ }
+
+ /* Assume position is valid */
+ workbuffer[position++] = 0x07;
+
+ if ((waypointp->sat>0)&&(waypointp->sat<128)) {
+ workbuffer[position++] = waypointp->sat;
+ } else {
+ workbuffer[position++] = 0;
+ }
+
+ (void)gbfwrite(workbuffer,vitosmt_datasize,1,ofs);
+
+ xfree(workbuffer);
+}
+
+
+static void
+vitosmt_write()
+{
+ auto* workbuffer = (unsigned char*) xcalloc(vitosmt_headersize,1);
+
+ count = 0;
+
+ /* leave a spacer for the header */
+ memset(workbuffer,0,vitosmt_headersize);
+ (void)gbfwrite(workbuffer,vitosmt_headersize,1,ofs);
+
+ if (doing_wpts) { /* process as waypoints */
+ waypt_disp_all(vitosmt_waypt_pr);
+ } else if (doing_rtes) { /* process as route */
+ route_disp_all(nullptr, nullptr, vitosmt_waypt_pr);
+ } else { /* default track mode */
+ track_disp_all(nullptr, nullptr, vitosmt_waypt_pr);
+ }
+
+
+ /* write the complete the header */
+ size_t position = 0;
+ le_write32(&workbuffer[position],vitosmt_version);
+ position += sizeof(uint32_t);
+ le_write32(&workbuffer[position],vitosmt_subversion);
+ position += sizeof(uint32_t);
+ le_write32(&workbuffer[position],count);
+ position += sizeof(uint32_t);
+ le_write32(&workbuffer[position],0);
+ position += sizeof(uint32_t);
+ le_write32(&workbuffer[position],count-1);
+ position += sizeof(uint32_t);
+ le_write32(&workbuffer[position],count);
+ position += sizeof(uint32_t);
+
+ gbfrewind(ofs);
+ (void)gbfwrite(workbuffer,vitosmt_headersize,1,ofs);
+
+ xfree(workbuffer);
+}
+
+ff_vecs_t vitosmt_vecs = {
+ ff_type_file,
+ FF_CAP_RW_ALL,
+ rd_init,
+ wr_init,
+ rd_deinit,
+ wr_deinit,
+ vitosmt_read,
+ vitosmt_write,
+ nullptr,
+ nullptr,
+ CET_CHARSET_UTF8, 1 /* do nothing | CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ Read Vito SmartMap .vtt tracks
+
+ Copyright (C) 2007 Jeremy Ehrhardt, jeremye@caltech.edu
+
+based on vitostc.c, which is
+Copyright (C) 2005 Etienne TASSE
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include "defs.h"
+#include <cmath>
+
+#define MYNAME "vitovtt"
+
+#define TM_YEAR_ZERO 1900
+#define TM_MONTH_ZERO 1
+
+static gbfile* infile = nullptr;
+static int count = 0;
+
+static const int vitovtt_version = 3;
+// static const size_tvitovtt_headersize = 16;
+// static const size_tvitovtt_datasize = 32;
+
+static const double vitovtt_latitudescale = 20000000.0;
+static const double vitovtt_longitudescale = 10000000.0;
+static const int vitovtt_secondscale = 30000000;
+static const int vitovtt_microsecondscale = 30;
+
+static void
+rd_init(const QString& fname)
+{
+ infile = gbfopen_le(fname, "rb", MYNAME);
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(infile);
+}
+
+static void
+vitovtt_read()
+{
+ struct tm tmStruct;
+
+ memset(&tmStruct, 0, sizeof(tmStruct));
+
+ auto* rte = new route_head;
+ track_add_head(rte);
+
+ /* Read the header. */
+ int version = gbfgetint32(infile);
+ count = gbfgetint32(infile);
+
+ if (version != vitovtt_version) {
+ fatal("%s (%d) reading file. Unsupported version %d\n",
+ MYNAME, __LINE__, version);
+ }
+
+ while (count) {
+ /* Read an entry. */
+ int scaled_lat = gbfgetint32(infile);
+ int scaled_lon = gbfgetint32(infile);
+ double altitude = gbfgetflt(infile);
+ tmStruct.tm_year = gbfgetint16(infile) - TM_YEAR_ZERO;
+ tmStruct.tm_mon = gbfgetc(infile) - TM_MONTH_ZERO;
+ tmStruct.tm_mday = gbfgetc(infile);
+ tmStruct.tm_hour = gbfgetc(infile);
+ tmStruct.tm_min = gbfgetc(infile);
+ int scaled_sec = gbfgetint32(infile);
+ double speed = gbfgetflt(infile);
+ int course = gbfgetint16(infile);
+ int status = gbfgetint32(infile);
+
+ auto* wpt_tmp = new Waypoint;
+
+ wpt_tmp->latitude= scaled_lat / vitovtt_latitudescale;
+ wpt_tmp->longitude= scaled_lon / vitovtt_longitudescale;
+ wpt_tmp->altitude= altitude;
+
+ tmStruct.tm_sec = scaled_sec / vitovtt_secondscale;
+ int microseconds = (scaled_sec % vitovtt_secondscale) / vitovtt_microsecondscale;
+ wpt_tmp->SetCreationTime(mkgmtime(&tmStruct), lround(microseconds/1000.0));
+ /*
+ * TODO: interpret speed, course, status
+ */
+ (void) speed;
+ (void) course;
+ (void) status;
+
+ track_add_wpt(rte, wpt_tmp);
+
+ count--;
+ }
+}
+
+ff_vecs_t vitovtt_vecs = {
+ ff_type_file,
+ { ff_cap_none, ff_cap_read, ff_cap_none },
+ rd_init,
+ nullptr,
+ rd_deinit,
+ nullptr,
+ vitovtt_read,
+ nullptr,
+ nullptr,
+ nullptr,
+ CET_CHARSET_UTF8, 1/* do nothing | CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+
+ Reader for Honda/Acura (Alpine) Navigation System VP Log (VPL) files
+
+ Copyright (C) 2009 Chris Tracy, gpsbabel@adiemus.org
+ Copyright (C) 2005 Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+/*
+ With logging enabled (Diagnostic Menu | Functional Setup | Log Data), VPL
+ files are written to the PC Card. The files themselves are written out as
+ ASCII files, mostly containing lines of hexadecimal characters. The format
+ seems similar to NMEA, with various sentences carrying different types of
+ information. For our purposes, the only sentence that matters is the '75'
+ sentence. For example:
+
+75700241FA59FB242CD500CF041984991E0B0A0C09060613064509060613064424824D68FF00000800051C000271
+00--1111111122222222333344445555--667788999999999999AAAAAAAAAAAA--------------------------XX
+
+0 - Sentence type
+1 - Latitude in hex (signed, divide by 0xE1000 for decimal degrees)
+ 0241FA59 -> 37878361 / 0xE1000 = 41.100652
+2 - Longitude in hex (signed, divide by 0xE1000 for decimal degrees)
+ FB242CD5 -> -81515307 / 0xE1000 = -88.449769
+3 - Altitude (signed, meters)
+ 00CF -> 207
+4 - Speed (divide by 0x10 for MPH)
+ 0419 -> 1049 / 0x10 = 65.5625
+5 - Heading (multiply by 360/65535 to constrain to 0 - 360 degrees)
+ 8499 -> 33945 * (360/65535) = 186.47
+6 - Number of sats
+ 0B -> 11
+7 - HDOP (divide by 8)
+ 0A -> 10 / 8 = 1.25
+8 - VDOP (divide by 8)
+ 0C -> 12 / 8 = 1.5
+9 - Date and Time (YYMMDDHHMMSS)
+ 090606130645 = June 6, 2009 13:06:45
+A - Previous line date and time (?)
+ 090606130644 = June 6, 2009 13:06:44
+X - Checksum (xor, ala NMEA)
+
+***********************************
+* Unused, but (at least partially) decoded sentences
+
+******
+0D - Yaw Gyro (This field is not currently decoded herein)
+ This field is written 25 times per second. It contains the raw values
+ from the yaw gyro. Positive values for right turns, negative values
+ for left turns.
+
+0D00FEFA09
+00??1111CC
+
+0 - Sentence Type
+? - An unknown field with observed values between 0 and 3.
+1 - Yaw Gyro value
+C - Checksum
+
+******
+31 - Distance Traveled
+ This field is written once a second. It contains the number of
+ meters traveled since the navigation system was last turned on.
+
+310000117050
+0011111111CC
+
+0 - Sentence Type
+1 - Distance Traveled in Meters
+C - Checksum
+
+******
+35 - Raw Position
+ This field is written 5 times per second. It contains Latitude
+ and Longitude, as well as two currently unknown angular values.
+
+35CFBB5CBC1744CB1BD9023308C2
+00111111112222222233334444CC
+
+0 - Sentence Type
+1 - Longitude (divide by 0x8CA000 for decimal degrees)
+2 - Latitude (divide by 0x8CA000 for decimal degrees)
+3 - Unknown angular value (multiply by 360/65535)
+4 - Unknown angular value (multiply by 360/65535)
+C - Checksum
+
+*/
+
+/*
+ TODO:
+ - Implement checksum verification
+ */
+
+#include "defs.h"
+#include <cstdio> /* for sscanf */
+
+#define MYNAME "vpl"
+
+static void vpl_parse_75_sentence(const char*);
+
+static
+QVector<arglist_t> vpl_args = {
+};
+
+static gbfile* vpl_file_in;
+static route_head* track_head;
+
+/*******************************************************************************
+* %%% global callbacks called by gpsbabel main process %%% *
+*******************************************************************************/
+
+static void
+vpl_rd_init(const QString& fname)
+{
+ vpl_file_in = gbfopen(fname, "r", MYNAME);
+}
+
+static void
+vpl_rd_deinit()
+{
+ gbfclose(vpl_file_in);
+}
+
+static void
+vpl_read()
+{
+ char* ibuf;
+
+ // Set up a track
+ if (track_head == nullptr) {
+ track_head = new route_head;
+ track_add_head(track_head);
+ }
+
+ while ((ibuf = gbfgetstr(vpl_file_in))) {
+ if (strncmp(ibuf, "75", 2) == 0) {
+ vpl_parse_75_sentence(ibuf);
+ }
+ }
+}
+
+/*******************************************************************************
+* Local Functions
+*******************************************************************************/
+
+void
+vpl_parse_75_sentence(const char* ibuf)
+{
+ uint32_t ymd, hms;
+ int32_t lat_raw, lon_raw;
+ int16_t alt, speed_raw;
+ uint16_t hdg_raw;
+ uint8_t sats, hdop_raw, vdop_raw;
+ struct tm tm;
+
+ // The files have DOS line endings (CR/LF) but we don't care, because we
+ // don't read to the end.
+ sscanf(ibuf, "75%*2c%8X%8X%4hX%4hX%4hX%*2c%2hhX%2hhX%2hhX%6u%6u",
+ &lat_raw, &lon_raw, &alt, &speed_raw, &hdg_raw, &sats, &hdop_raw, &vdop_raw,
+ &ymd, &hms);
+
+ tm.tm_sec = hms % 100;
+ hms /= 100;
+ tm.tm_min = hms % 100;
+ hms /= 100;
+ tm.tm_hour = hms % 100;
+
+ tm.tm_mday = ymd % 100;
+ ymd /= 100;
+ tm.tm_mon = ymd % 100;
+ ymd /= 100;
+ tm.tm_year = ymd % 100 + 100;
+
+ auto* waypt = new Waypoint;
+
+ // Lat/Lon are both stored *0xE1000 which we have to divide out
+ // for decimal degrees
+ waypt->latitude = lat_raw / (double) 0xE1000;
+ waypt->longitude = lon_raw / (double) 0xE1000;
+ waypt->altitude = alt;
+ waypt->sat = sats;
+ // Speed comes in (MPH x 0x10) which we have to convert to m/s
+ WAYPT_SET(waypt, speed, (speed_raw / (double) 0x10) * 0.44704);
+ WAYPT_SET(waypt, course, hdg_raw * (360.0f/65535.0f));
+ waypt->hdop = hdop_raw / 8.0;
+ waypt->vdop = vdop_raw / 8.0;
+
+ waypt->SetCreationTime(mkgmtime(&tm));
+
+ track_add_wpt(track_head, waypt);
+}
+
+/**************************************************************************/
+
+ff_vecs_t vpl_vecs = {
+ ff_type_file,
+ {
+ ff_cap_none /* waypoints */,
+ ff_cap_read /* tracks */,
+ ff_cap_none /* routes */
+ },
+ vpl_rd_init,
+ nullptr,
+ vpl_rd_deinit,
+ nullptr,
+ vpl_read,
+ nullptr,
+ nullptr,
+ &vpl_args,
+ CET_CHARSET_ASCII, /* ascii is the expected character set */
+ 1 /* fixed, can't be changed through command line parameter */
+ , NULL_POS_OPS,
+ nullptr
+};
+/**************************************************************************/
--- /dev/null
+/*
+ Copyright (C) 2006 Etienne Tasse etasse@yahoo.com
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include "defs.h"
+#include "xmlgeneric.h"
+#include <QXmlStreamAttributes>
+#include <cstdio>
+
+/* argument storage */
+static char* aicicon =nullptr;
+static char* aioicon =nullptr;
+static char* ahcicon =nullptr;
+static char* ahoicon =nullptr;
+static char* snmac =nullptr;
+
+static
+QVector<arglist_t> wfff_xml_args = {
+ {
+ "aicicon", &aicicon, "Infrastructure closed icon name",
+ "Red Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "aioicon", &aioicon, "Infrastructure open icon name",
+ "Green Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "ahcicon", &ahcicon, "Ad-hoc closed icon name",
+ "Red Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "ahoicon", &ahoicon, "Ad-hoc open icon name",
+ "Green Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {"snmac", &snmac, "Shortname is MAC address", nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr },
+};
+
+#define xfreez(p) { if (p) xfree(p); p=0; }
+
+#define MYNAME "wfff_xml"
+
+static xg_callback wfff_s, wfff_e;
+static xg_callback wfff_wep, wfff_mac, wfff_type;
+static xg_callback wfff_ssid, wfff_chan;
+static xg_callback wfff_mnrssi, wfff_mxrssi;
+static xg_callback wfff_first, wfff_last;
+static xg_callback wfff_hdop, wfff_lat, wfff_lon;
+
+static
+xg_tag_mapping loc_map[] = {
+ { wfff_s, cb_start, "/DocumentElement/AP" },
+ { wfff_e, cb_end, "/DocumentElement/AP" },
+ { wfff_wep, cb_cdata, "/DocumentElement/AP/WEP" },
+ { wfff_mac, cb_cdata, "/DocumentElement/AP/MAC" },
+ { wfff_ssid, cb_cdata, "/DocumentElement/AP/SSID" },
+ { wfff_type, cb_cdata, "/DocumentElement/AP/Type" },
+ { wfff_mnrssi, cb_cdata, "/DocumentElement/AP/MinRSSI" },
+ { wfff_mxrssi, cb_cdata, "/DocumentElement/AP/MaxRSSI" },
+ { wfff_chan, cb_cdata, "/DocumentElement/AP/Channel" },
+ { wfff_first, cb_cdata, "/DocumentElement/AP/FirstSeen" },
+ { wfff_last, cb_cdata, "/DocumentElement/AP/LastSeen" },
+ { wfff_hdop, cb_cdata, "/DocumentElement/AP/HDOP" },
+ { wfff_lat, cb_cdata, "/DocumentElement/AP/Lat" },
+ { wfff_lon, cb_cdata, "/DocumentElement/AP/Lon" },
+ { nullptr,(xg_cb_type)0,nullptr }
+};
+
+/* work variables for wfff_xxx */
+static QString ap_mac;
+static QString ap_ssid;
+static QString ap_type;
+static QString ap_wep;
+static int ap_chan =0;
+static time_t ap_first =0;
+static QString ap_last;
+static float ap_mnrssi =0.0;
+static float ap_mxrssi =0.0;
+static float ap_hdop =0.0;
+static double ap_lat =0.0;
+static double ap_lon =0.0;
+
+/* Start of AP block */
+void wfff_s(xg_string, const QXmlStreamAttributes*)
+{
+ ap_mnrssi=0.0;
+ ap_mxrssi=0.0;
+ ap_chan=0;
+ ap_hdop=0.0;
+ ap_first=0;
+ ap_last=QString();
+ ap_lat=0.0;
+ ap_lon=0.0;
+}
+
+void wfff_mac(const QString& args, const QXmlStreamAttributes*) {
+ ap_mac = args;
+}
+void wfff_ssid(const QString& args, const QXmlStreamAttributes*) {
+ ap_ssid = args;
+}
+void wfff_type(const QString& args, const QXmlStreamAttributes*) {
+ ap_type = args;
+}
+void wfff_mnrssi(const QString& args, const QXmlStreamAttributes*) {
+ ap_mnrssi = args.toDouble();
+}
+void wfff_mxrssi(const QString& args, const QXmlStreamAttributes*) {
+ ap_mxrssi = args.toDouble();
+}
+void wfff_chan(const QString& args, const QXmlStreamAttributes*) {
+ ap_chan = args.toInt();
+}
+void wfff_first(const QString& args, const QXmlStreamAttributes*) {
+ ap_first = xml_parse_time(args).toTime_t();
+}
+void wfff_last(const QString& args, const QXmlStreamAttributes*) {
+ ap_last = args;
+}
+void wfff_wep(const QString& args, const QXmlStreamAttributes*) {
+ ap_wep = args;
+}
+void wfff_hdop(const QString& args, const QXmlStreamAttributes*) {
+ ap_hdop = args.toDouble();
+}
+void wfff_lat(const QString& args, const QXmlStreamAttributes*) {
+ ap_lat = args.toDouble();
+}
+void wfff_lon(const QString& args, const QXmlStreamAttributes*) {
+ ap_lon = args.toDouble();
+}
+
+/* End of AP Block, set waypoint and add */
+static long tosscount=0;
+
+void wfff_e(xg_string, const QXmlStreamAttributes*)
+{
+ char desc[255] ="\0";
+
+ if ((ap_hdop>=1)&&(ap_hdop<50)) { // Discard invalid GPS fix
+ auto* wpt_tmp = new Waypoint;
+
+ if (snmac) {
+ wpt_tmp->shortname = ap_mac;
+ } else {
+ wpt_tmp->shortname = ap_ssid;
+ }
+
+ snprintf(desc, sizeof desc,
+ "%s/%s/WEP %s/Ch %d/%2.0fdB/%2.0fdB/%s",
+ snmac?CSTR(ap_ssid):CSTR(ap_mac), CSTR(ap_type), CSTR(ap_wep),
+ ap_chan, ap_mnrssi, ap_mxrssi, CSTR(ap_last));
+ wpt_tmp->description = desc;
+
+ wpt_tmp->latitude = ap_lat;
+ wpt_tmp->longitude = ap_lon;
+ wpt_tmp->hdop = ap_hdop;
+ wpt_tmp->altitude = unknown_alt;
+ wpt_tmp->fix = fix_unknown;
+
+ QString ap_wep_(ap_wep);
+ QString ap_type_(ap_type);
+ if (ap_wep_.startsWith("on", Qt::CaseInsensitive)) {
+ if (ap_type_.startsWith("AP", Qt::CaseInsensitive)) {
+ wpt_tmp->icon_descr = aicicon; /* Infra Closed */
+ } else {
+ wpt_tmp->icon_descr = ahcicon; /* AdHoc Closed */
+ }
+ } else {
+ if (ap_type_.startsWith("AP", Qt::CaseInsensitive)) {
+ wpt_tmp->icon_descr = aioicon; /* Infra Open */
+ } else {
+ wpt_tmp->icon_descr = ahoicon; /* AdHoc Open */
+ }
+ }
+
+ wpt_tmp->SetCreationTime(ap_first);
+
+ waypt_add(wpt_tmp);
+
+ } else {
+ tosscount++;
+ }
+}
+
+static void
+wfff_xml_rd_init(const QString& fname)
+{
+ tosscount = 0;
+
+ xml_init(fname, loc_map, nullptr);
+}
+
+void
+static wfff_xml_read()
+{
+ xml_read();
+}
+
+void
+static wfff_xml_rd_deinit()
+{
+ xml_deinit();
+
+ if (tosscount) {
+ warning("Warning: %s reading file. Threw away %ld invalid entries.\n",
+ MYNAME, tosscount);
+ }
+
+}
+
+ff_vecs_t wfff_xml_vecs = {
+ ff_type_file,
+ {ff_cap_read, ff_cap_none, ff_cap_none},
+ wfff_xml_rd_init,
+ nullptr,
+ wfff_xml_rd_deinit,
+ nullptr,
+ wfff_xml_read,
+ nullptr,
+ nullptr,
+ &wfff_xml_args,
+ CET_CHARSET_UTF8, 0,
+ NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ Read Yahoo Geocoded files.
+
+ Copyright (C) 2005 Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+
+#include <QXmlStreamAttributes> // for QXmlStreamAttributes
+
+#include "defs.h"
+#include "yahoo.h"
+#include "xmlgeneric.h" // for xg_string, build_xg_tag_map, xml_deinit, xml_init, xml_read
+
+
+#define MYNAME "yahoo"
+
+void
+YahooFormat::rd_init(const QString& fname)
+{
+ xml_init(fname, build_xg_tag_map(this, gl_map), nullptr, nullptr, nullptr, true);
+}
+
+void
+YahooFormat::read()
+{
+ xml_read();
+}
+
+void
+YahooFormat::rd_deinit()
+{
+ xml_deinit();
+}
+
+void
+YahooFormat::wpt_s(xg_string, const QXmlStreamAttributes*)
+{
+ wpt_tmp = new Waypoint;
+}
+
+void
+YahooFormat::wpt_e(xg_string, const QXmlStreamAttributes*)
+{
+ waypt_add(wpt_tmp);
+ wpt_tmp = nullptr;
+}
+
+void
+YahooFormat::wpt_lat(xg_string args, const QXmlStreamAttributes*)
+{
+ wpt_tmp->latitude = args.toDouble();
+}
+
+void
+YahooFormat::wpt_lon(xg_string args, const QXmlStreamAttributes*)
+{
+ wpt_tmp->longitude = args.toDouble();
+}
+
+void
+YahooFormat::wpt_addr(xg_string args, const QXmlStreamAttributes*)
+{
+ if (!wpt_tmp->notes.isEmpty()) {
+ wpt_tmp->notes += as;
+ }
+ wpt_tmp->notes += args;
+}
--- /dev/null
+/*
+ Read Yahoo Geocoded files.
+
+ Copyright (C) 2002-2020 Robert Lipe, gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+#ifndef YAHOO_H_INCLUDED_
+#define YAHOO_H_INCLUDED_
+
+#include <QList> // for QList
+#include <QString> // for QString
+#include <QVector> // for QVector
+#include <QXmlStreamAttributes> // for QXmlStreamAttributes
+
+#include "defs.h"
+#include "format.h" // for Format
+#include "xmlgeneric.h" // for xg_tag_map_entry, cb_cdata, XgFunctor, cb_end, cb_start
+
+class YahooFormat : public Format
+{
+public:
+ QVector<arglist_t>* get_args() override
+ {
+ return &yahoo_args;
+ }
+
+ ff_type get_type() const override
+ {
+ return ff_type_file;
+ }
+
+ QVector<ff_cap> get_cap() const override
+ {
+ return {
+ ff_cap_read, // waypoints
+ ff_cap_none, // tracks
+ ff_cap_none // routes
+ };
+ }
+
+ QString get_encode() const override
+ {
+ return CET_CHARSET_ASCII;
+ }
+
+ int get_fixed_encode() const override
+ {
+ return 0;
+ }
+
+ void rd_init(const QString&) override;
+ void read() override;
+ void rd_deinit() override;
+
+private:
+ Waypoint* wpt_tmp{};
+ char* as{};
+
+ QVector<arglist_t> yahoo_args = {
+ {
+ "addrsep", &as,
+ "String to separate concatenated address fields (default=\", \")",
+ ", ", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ };
+
+ void wpt_s(const QString&, const QXmlStreamAttributes*);
+ void wpt_e(const QString&, const QXmlStreamAttributes*);
+ void wpt_lat(const QString&, const QXmlStreamAttributes*);
+ void wpt_lon(const QString&, const QXmlStreamAttributes*);
+ void wpt_addr(const QString&, const QXmlStreamAttributes*);
+
+ QList<xg_functor_map_entry<YahooFormat>> gl_map = {
+ {&YahooFormat::wpt_s, cb_start, "/ResultSet/Result"},
+ {&YahooFormat::wpt_lat, cb_cdata, "/ResultSet/Result/Latitude"},
+ {&YahooFormat::wpt_lon, cb_cdata, "/ResultSet/Result/Longitude"},
+ {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/Address"},
+ {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/City"},
+ {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/State"},
+ {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/Zip"},
+ {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/Country"},
+ {&YahooFormat::wpt_e, cb_end, "/ResultSet/Result"}
+ };
+};
+
+#endif // YAHOO_H_INCLUDED_
+++ /dev/null
-/*
-
- Support for G7ToWin data files (.g7t),
- Copyright (C) 2007 Olaf Klein, o.b.klein@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-/*
- History:
- 04/07/2007: start programming
- 04/15/2007: added to gpsbabel
-*/
-
-#include "defs.h"
-#include "cet_util.h"
-#include "csv_util.h"
-#include "garmin_fs.h"
-#include "garmin_tables.h"
-#include "jeeps/gpsmath.h"
-#include "strptime.h"
-
-#include <cstdio>
-#include <cstdlib>
-#include <ctime>
-
-#if CSVFMTS_ENABLED
-
-#define MYNAME "g7towin"
-
-#define G7T_HEADER "Version 2:G7T"
-
-static gbfile* fin;
-static grid_type grid;
-static int datum;
-static gpsdata_type mode;
-static double altf;
-static int gardown;
-static int event_ct;
-
-static
-QVector<arglist_t> g7towin_args = {
-};
-
-#define WAYPT__OFS 0x00000
-#define TRKPT__OFS 0x01000
-
-#define WPT_c0_OFS 0x0c000
-#define WPT_c1_OFS 0x0c100
-#define WPT_c2_OFS 0x0c200
-#define WPT_c3_OFS 0x0c300
-#define WPT_c4_OFS 0x0c400
-#define WPT_c5_OFS 0x0c500
-#define WPT_c6_OFS 0x0c600
-#define WPT_c7_OFS 0x0c700
-#define WPT_c8_OFS 0x0c800
-#define WPT_cA_OFS 0x0cA00
-#define WPT_cB_OFS 0x0cB00
-#define WPT_cC_OFS 0x0cC00
-#define WPT_cD_OFS 0x0cD00
-
-static void
-parse_line(char* buff, int index, const char* delimiter, Waypoint* wpt)
-{
- char* cin;
- garmin_fs_t* gmsd = garmin_fs_t::find(wpt);
-
- while ((cin = csv_lineparse(buff, delimiter, "", index++))) {
-
- buff = nullptr;
- cin = lrtrim(cin);
-
- if ((*cin == '\0') ||
- (strcmp(cin, "INF") == 0) ||
- (strcmp(cin, "1e25") == 0) ||
- (strcmp(cin, "1.0e25") == 0)) {
- continue;
- }
-
- switch (index) {
-
- int categories;
- struct tm tm;
- char* cerr;
-
- case TRKPT__OFS + 1:
- cin += parse_coordinates(cin, datum, grid,
- &wpt->latitude, &wpt->longitude, MYNAME);
- while (isspace(*cin)) {
- cin++;
- }
-
- memset(&tm, 0, sizeof(tm));
- cerr = strptime(cin, "%a %b %d %H:%M:%S %Y", &tm);
- if (cerr == nullptr) {
- fatal(MYNAME ": Unable to convert date (%s)!\n", cin);
- }
- wpt->SetCreationTime(mkgmtime(&tm));
- break;
-
- case WAYPT__OFS + 1:
- wpt->description = (cin);
- break;
-
- case WAYPT__OFS + 2:
- wpt->icon_descr = gt_find_desc_from_icon_number(
- atoi(cin), PCX);
- break;
-
- case WAYPT__OFS + 4:
- if (strcmp(cin, "S+C") == 0) {
- garmin_fs_t::set_display(gmsd, gt_display_mode_symbol_and_comment);
- } else if (strcmp(cin, "S") == 0) {
- garmin_fs_t::set_display(gmsd, gt_display_mode_symbol);
- } else if (strcmp(cin, "S+N") == 0) {
- garmin_fs_t::set_display(gmsd, gt_display_mode_symbol_and_name);
- }
- break;
-
- case WPT_cA_OFS + 1:
- case WPT_c1_OFS + 1:
- wpt->shortname = cin;
- break;
-
- case WPT_cA_OFS + 4:
- case WPT_c4_OFS + 2:
- garmin_fs_t::set_city(gmsd, cin);
- break;
-
- case WPT_cA_OFS + 5:
- case WPT_c4_OFS + 3:
- garmin_fs_t::set_state(gmsd, cin);
- break;
-
- case WPT_cA_OFS + 6:
- case WPT_c4_OFS + 4:
- garmin_fs_t::set_cc(gmsd, cin);
- break;
-
- case WPT_cB_OFS + 1:
- case WPT_c6_OFS + 2:
- garmin_fs_t::set_facility(gmsd, cin);
- break;
-
- case WPT_cB_OFS + 2:
- case WPT_c6_OFS + 3:
- garmin_fs_t::set_addr(gmsd, cin);
- break;
-
- case WPT_cB_OFS + 3: /*cross road */
- case WPT_c6_OFS + 4:
- garmin_fs_t::set_cross_road(gmsd, cin);
- break;
-
- case TRKPT__OFS + 2: /* altitude */
- case WPT_cC_OFS + 1:
- case WPT_c5_OFS + 1:
- case WPT_c8_OFS + 1:
- wpt->altitude = altf * atof(cin);
- break;
-
- case TRKPT__OFS + 3: /* depth */
- case WPT_cC_OFS + 2:
- case WPT_c5_OFS + 2:
- case WPT_c8_OFS + 2:
- WAYPT_SET(wpt, depth, altf * atof(cin));
- break;
-
- case TRKPT__OFS + 10: /* temperature */
- if (*cin == '|') {
- cin++; /* in track points */
- }
- if (strcmp(cin, "1e25") == 0) {
- break;
- }
- if (strcmp(cin, "1.0e25") == 0) {
- break;
- }
- [[fallthrough]];
- case WPT_cD_OFS + 1:
- case WPT_cB_OFS + 6:
- WAYPT_SET(wpt, temperature, atof(cin));
- break;
-
- case WAYPT__OFS + 6: /* proximity */
- case WPT_cD_OFS + 2:
- WAYPT_SET(wpt, proximity, atof(cin));
- break;
-
- case WPT_cB_OFS + 5:
- case WPT_cD_OFS + 3:
- categories = atoi(cin);
- if (categories != 0) {
- garmin_fs_t::set_category(gmsd, atoi(cin));
- }
- break;
-
-#if 0
-
- /* currently unused */
-
- case TRKPT__OFS + 5: /* distance from previous point */
- case TRKPT__OFS + 6: /* distance from segment start */
- case TRKPT__OFS + 7: /* distance from start */
- case TRKPT__OFS + 8: /* velocity from previous point */
- case TRKPT__OFS + 9: /* time (in seconds) from previous point */
- break;
-
- case WAYPT__OFS + 3: /* ignore color */
- break;
-
- case WAYPT__OFS + 5: /* always '0' */
- break;
-
- case TRKPT__OFS + 4:
- if (case_ignore_strcmp(cin, "FT") == 0) ;
- else if (case_ignore_strcmp(cin, "M") == 0) ;
- else if (case_ignore_strcmp(cin, "SM") == 0) ;
- else if (case_ignore_strcmp(cin, "NM") == 0) ;
- else if (case_ignore_strcmp(cin, "KM") == 0) ;
- break;
-
- case WPT_cB_OFS + 4: /* unknown (datatype) */
- break;
-
- case WPT_cC_OFS + 3: /* waypt_class (always FF) */
- break;
-
- case WPT_cC_OFS + 4: /* class & subclass */
- case WPT_cC_OFS + 5:
- case WPT_cC_OFS + 6:
- case WPT_cC_OFS + 7:
- case WPT_cC_OFS + 8:
- case WPT_cC_OFS + 9:
- case WPT_cC_OFS + 10:
- case WPT_cC_OFS + 11:
- case WPT_cC_OFS + 12:
- case WPT_cC_OFS + 13:
- case WPT_cC_OFS + 14:
- case WPT_cC_OFS + 15:
- case WPT_cC_OFS + 16:
- case WPT_cC_OFS + 17:
- case WPT_cC_OFS + 18:
- case WPT_cC_OFS + 19:
- case WPT_cC_OFS + 20:
- case WPT_cC_OFS + 21:
- break;
-
- case WPT_cC_OFS + 22:
- /* distance */
- break;
-#endif
- }
- }
-}
-
-static Waypoint*
-parse_waypt(char* buff)
-{
- char* cin;
- struct tm tm;
-
- auto* wpt = new Waypoint;
- garmin_fs_t* gmsd = garmin_fs_alloc(-1);
- wpt->fs.FsChainAdd(gmsd);
-
- if (gardown) {
- cin = buff + 6;
- } else {
- /* We've seen waypoints with length of 14 and 15 !!! */
- cin = buff + 15;
- while ((cin > buff) && (! isspace(*cin))) {
- cin--;
- }
- }
-
- while (isspace(*cin)) {
- cin--;
- }
- if (cin >= buff) {
- char*s = xstrndup(buff, cin - buff + 1);
- wpt->shortname = s;
- xfree(s);
- }
-
- if (gardown) {
- buff += 6;
- } else {
- buff += 15;
- }
- while (isspace(*buff)) {
- buff++;
- }
-
- buff += parse_coordinates(buff, datum, grid,
- &wpt->latitude, &wpt->longitude, MYNAME);
- while (isspace(*buff)) {
- buff++;
- }
-
- memset(&tm, 0, sizeof(tm));
- char* cerr = strptime(buff, "%a %b %d %H:%M:%S %Y", &tm);
- if (cerr == nullptr) {
- fatal(MYNAME ": Unable to convert date (%s)!\n", buff);
- }
- wpt->SetCreationTime(mkgmtime(&tm));
-
- /* go over time stamp */
- int i = 5;
- while (buff && i) {
- i--;
- buff = strchr(buff, ' ');
- if (buff) {
- buff++;
- }
- }
- if (gardown && (buff == nullptr)) {
- return wpt;
- }
- is_fatal((buff == nullptr), MYNAME ": Incomplete waypoint line!");
-
- while (isspace(*buff)) {
- buff++;
- }
-
- parse_line(buff, WAYPT__OFS, "^", wpt);
-
- return wpt;
-}
-
-static Waypoint*
-parse_trkpt(char* buff)
-{
- auto* wpt = new Waypoint;
- garmin_fs_t* gmsd = garmin_fs_alloc(-1);
- wpt->fs.FsChainAdd(gmsd);
-
- parse_line(buff, TRKPT__OFS, ";", wpt);
-
- return wpt;
-}
-
-/*
- * parse_categories is currently only a dummy procedure.
- * w'll need a central storage with binding to the module
- * which has established a list of category names.
- */
-
-static void
-parse_categories(char* buff)
-{
- char* cin;
- int cat = 0;
-
- while ((cin = csv_lineparse(buff, ",", "", cat++))) {
- uint16_t cx;
-
- buff = nullptr;
-
- cin = lrtrim(cin);
- if (*cin == 0) {
- continue;
- }
-
- garmin_fs_convert_category(cin, &cx);
- }
-}
-
-
-/* main functions */
-
-static void
-rd_init(const QString& fname)
-{
- fin = gbfopen(fname, "rb", MYNAME);
-
- gardown = 1;
- mode = wptdata;
- grid = grid_lat_lon_dmm;
- datum = DATUM_WGS84;
- altf = 1;
- event_ct = 0;
-}
-
-static void
-rd_deinit()
-{
- gbfclose(fin);
-}
-
-static void
-data_read()
-{
- char* buff;
- int line = 0;
- Waypoint* wpt = nullptr;
- route_head* head = nullptr;
-
- while ((buff = gbfgetstr(fin))) {
- if ((line++ == 0) && fin->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
-
- char* cin = lrtrim(buff);
- if (!*cin) {
- continue;
- }
-
- char* cdata = cin+1;
- while (! isspace(*cdata)) {
- cdata++;
- }
- while (isspace(*cdata)) {
- cdata++;
- }
- if (! *cdata) {
- continue;
- }
-
- switch (*cin) {
-
- case '#': /* comment */
- break;
-
- case 'A':
- if (case_ignore_strncmp(cdata, "Meter", 5) == 0) {
- altf = 1.0;
- } else if (case_ignore_strncmp(cdata, "Feet", 4) == 0) {
- altf = FEET_TO_METERS(1.0);
- }
- break;
-
- case 'C': /* categories */
- parse_categories(cdata);
- break;
-
- case 'D':
- datum = gt_lookup_datum_index(cdata, MYNAME);
- break;
-
- case 'I': /* event point */
- wpt = new Waypoint;
- cdata += parse_coordinates(cdata, datum, grid,
- &wpt->latitude, &wpt->longitude, MYNAME);
- wpt->shortname = QString("Event%1").arg(++event_ct);
- while (isspace(*cdata)) {
- cdata++;
- }
- if (*cdata == ';') {
- cdata++;
- wpt->icon_descr = gt_find_desc_from_icon_number(
- atoi(cdata), PCX);
- }
- waypt_add(wpt);
- break;
-
- case 'M':
- grid = gt_lookup_grid_type(cdata, MYNAME);
- break;
-
- case 'P': /* proximity waypoint */
- case 'W': /* normal waypoint */
- wpt = parse_waypt(cin + 3);
- if (wpt) {
- if (mode == rtedata) {
- route_add_wpt(head, wpt);
- } else {
- waypt_add(wpt);
- }
- }
- break;
-
- case 'c': /* additional lines */
- switch (*(cin+1)) {
- int index;
-
- case 'A':
- case 'B':
- case 'C':
- case 'D':
-
- index = WPT_cA_OFS + ((*(cin+1) - 'A') * 256);
- parse_line(cdata, index, "|", wpt);
- break;
-
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
-
- index = WPT_c0_OFS + ((*(cin+1) - '0') * 256);
- parse_line(cdata, index, ";", wpt);
- break;
-
- case 'L':
- waypt_add_url(wpt, cdata, nullptr);
- break;
-
- default:
- break;
- }
- break;
-
- case 'N': /* track log header */
- mode = trkdata;
- head = new route_head;
- cdata = strchr(cdata, '-');
- if (cdata) {
- while (isspace(*cdata)) {
- cdata++;
- }
- if (*cdata) {
- char* s = strrchr(cdata, ',');
- if (s) {
- *s = '\0';
- s = strrchr(cdata, ',');
- if (s) {
- *s = '\0';
- head->rte_name = cdata;
- }
- }
- }
- }
- track_add_head(head);
- break;
-
- case 'R': /* route header */
- mode = rtedata;
- head = new route_head;
- cdata += 3; /*skip route number */
- if (*cdata) {
- head->rte_name = cdata;
- }
- route_add_head(head);
- break;
-
- case 'T':
- wpt = parse_trkpt(cdata);
- if (wpt) {
- track_add_wpt(head, wpt);
- }
- break;
-
- case 'V':
- if (strcmp(cin, G7T_HEADER) != 0) {
- fatal(MYNAME ": Invalid version or invalid file!\n");
- }
- gardown = 0;
- break;
-
- default:
- break;
- }
- }
-}
-
-/* --------------------------------------------------------------------------- */
-
-ff_vecs_t g7towin_vecs = {
- ff_type_file,
- { ff_cap_read, ff_cap_read, ff_cap_read },
- rd_init,
- nullptr,
- rd_deinit,
- nullptr,
- data_read,
- nullptr,
- nullptr,
- &g7towin_args,
- CET_CHARSET_MS_ANSI, 0
- , NULL_POS_OPS,
- nullptr
-};
-
-#endif /* CSVFMTS_ENABLED */
+++ /dev/null
-/*
-
-
- Copyright (C) 2008 Dr. J�rgen Neumann, Juergen.Neumann@online.de
- Copyright (C) 2005 Robert Lipe, robertlipe+source@gpsbabel.org (based on nmea.c)
- Copyright (C) 20XX probably many others from the gpsbabel development team ;-)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- =====================================================================================
-
- This file allows gpsbabel to read and write the internal track log format used by
- GoPal navigation systems. They produce a simple line-oriented format with one point per
- second. Unfortunately the the data does not contain a valid date, only some kind of timetick,
- together with each point (perhaps by mistake ??). So we have to parse the filename for a valid starting
- date and add the timeoffset. Second problem (at least to me) was that irregularly stupid errors were
- in the data, i.e. only one data point shows a totally wrong longitude or latitude. Everything else in
- the dataset seems ok, so I needed a way to sort out these errors. My solution is to calculate the speed
- between successive points and drop points not between minspeed and maxspeed. This way I can sort out most
- of this annoying bugs, a side effect is that if a minimum speed > 0 is set points with the same coordinates are also
- dropped.
-
- Fileformat GoPal
- TICK; TIME UTC; LONG; LAT; HEIGHT; SPEED km/h; FIX; HDOP; SAT
- 3801444, 080558, 2.944362, 43.262117, 295.28, 0.12964, 2, 2.900000, 3
- Filenames:
- trackYYYYMMDD_HHMMSS.trk
- A_YYYYMMDD_HHMMSS.trk
- with HHMMSS local time (not UTC)
-
- History
- 2008-07-18 initial release of Version 0.1
- 2008-07-26 bugfix: filenamehandling linux, format specification in write statement
-
- ToDo:
- - check for midnight & adjust
-*/
-
-#include "defs.h"
-#include "cet_util.h"
-#include "csv_util.h"
-#include "grtcirc.h"
-#include "jeeps/gpsmath.h"
-#include "strptime.h"
-#include <cmath>
-#include <cstdio>
-#include <cstdlib>
-#include <QDateTime>
-#include <QString>
-
-#define MYNAME "gopal"
-
-static gbfile* fin, *fout;
-
-static struct tm tm,filenamedate, trackdate;
-static time_t tx;
-static char* optdate=nullptr;
-static char* optmaxspeed=nullptr;
-static char* optminspeed=nullptr;
-static char* optclean= nullptr;
-static double minspeed,maxspeed;
-static struct tm opt_tm; /* converted "date" parameter */
-static
-QVector<arglist_t> gopal_args = {
- {"date", &optdate, "Complete date-free tracks with given date (YYYYMMDD).", nullptr, ARGTYPE_INT, ARG_NOMINMAX, nullptr },
- {"maxspeed", &optmaxspeed, "The maximum speed (km/h) traveling from waypoint to waypoint.", "200", ARGTYPE_INT, "1", "1000", nullptr },
- {"minspeed", &optminspeed, "The minimum speed (km/h) traveling from waypoint to waypoint. Set >0 to remove duplicate waypoints", "0", ARGTYPE_INT, "0", "999", nullptr },
- {"clean", &optclean, "Cleanup common errors in trackdata", "1", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr },
-};
-
-#define CHECK_BOOL(a) if (a && (*a == '0')) a = NULL
-
-static int gopal_check_line(char* line)
-{
- char* c = line;
- int i = 0;
- while ((c = strchr(c, ','))) {
- c++;
- i++;
- }
- return i;
-}
-
-
-
-/*******************************************************************************
-* %%% global callbacks called by gpsbabel main process %%% *
-*******************************************************************************/
-
-static void
-gopal_rd_init(const QString& fname)
-{
- CHECK_BOOL(optclean);
- if (optminspeed) {
- minspeed=atof(optminspeed);
- if (global_opts.debug_level > 1) {
- fprintf(stderr,"options from command line : gopal minspeed = %s\n",optminspeed);
- }
- } else {
- minspeed=0;
- }
- if (optmaxspeed) {
- maxspeed=atof(optmaxspeed);
- if (global_opts.debug_level > 1) {
- fprintf(stderr,"options from command line : gopal maxspeed = %s\n",optmaxspeed);
- }
- } else {
- maxspeed=200;
- }
- if (global_opts.debug_level > 1) {
- fprintf(stderr,"setting minspeed to %5.1lf km/h and maxspeed to %5.1lf km/h\n",minspeed,maxspeed);
- }
-
- fin = gbfopen(fname, "r", MYNAME);
-
- if (optdate) {
- memset(&opt_tm, 0, sizeof(opt_tm));
-
- char* ck = strptime(optdate, "%Y%m%d", &opt_tm);
- if ((ck == nullptr) || (*ck != '\0') || (strlen(optdate) != 8)) {
- fatal(MYNAME ": Invalid date \"%s\"!\n", optdate);
- } else if (opt_tm.tm_year < 70) {
- fatal(MYNAME ": Date \"%s\" is out of range (have to be 19700101 or later)!\n", optdate);
- }
- tx = mkgmtime(&opt_tm);
-
- } else {
- /* remove path */
- QString filename = get_filename(fname);
- QString datestr;
-
- if (filename.startsWith("track")&&(filename.length()>13)) { // we need at least 13 letters: trackYYYYMMDD...
- datestr = filename.mid(5,8);
- } else if (filename.startsWith("A_")&&(filename.length()>10)) { // here we expect at least 10 letters: A_YYYYMMDD...
- datestr = filename.mid(2,8);
- }
- // in buff we should now have something which looks like a valid date starting with YYYYMMDD
- /*ck = (char*)*/strptime(qPrintable(datestr), "%Y%m%d", &filenamedate);
- // if (((ck == NULL) || (*ck != '\0') )&&!(optdate))
- // fatal(MYNAME ": Invalid date in filename \"%s\", try to set manually using \"date\" switch!\n", buff);
- // /* else */ if (filenamedate.tm_year < 70)
- // fatal(MYNAME ": Date \"%s\" is out of range (have to be 19700101 or later)!\n", buff);
- // tx= mkgmtime(&filenamedate);
- }
-}
-
-static void
-gopal_rd_deinit()
-{
- gbfclose(fin);
-}
-
-static void
-gopal_read()
-{
-
- char* buff;
- double hmsd;
- int fix;
- int hms;
- Waypoint* lastwpt=nullptr;
- char tbuffer[64];
- struct tm tm2;
- double lat_old = 0;
-
-
- auto* route = new route_head;
- QDateTime qtx = QDateTime::fromSecsSinceEpoch(tx, Qt::UTC);
- route->rte_name = "Tracklog ";
- route->rte_name += qtx.toString(Qt::ISODate);
- route_add_head(route);
-
- long line = 0;
- while ((buff = gbfgetstr(fin))) {
- if ((line == 0) && fin->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
-
- char* str = buff = lrtrim(buff);
- if (*buff == '\0') {
- continue;
- }
- int nfields = gopal_check_line(buff);
- if ((nfields != 8) && (nfields != 11)) {
- continue;
- }
- // Old format. Hassle for date.
- if ((nfields == 8) && (tx == 0)) {
- // fatal(MYNAME ": Invalid date in filename \"%s\", try to set manually using \"date\" switch!\n", buff);
- }
- auto* wpt = new Waypoint;
-
- int column = -1;
- // the format of gopal is quite simple. Unfortunately the developers forgot the date as the first element...
- //TICK; TIME; LONG; LAT; HEIGHT; SPEED; Fix; HDOP; SAT
- //3801444, 080558, 2.944362, 43.262117, 295.28, 0.12964, 2, 2.900000, 3
- char* c = csv_lineparse(str, ",", "", column++);
- int millisecs = 0;
- while (c != nullptr) {
- switch (column) {
- case 0: /* "-" */ /* unknown fields for the moment */
- unsigned long microsecs;
- sscanf(c, "%lu", µsecs);
- // Just save this; we'll use it on the next field.
- millisecs = lround((microsecs % 1000000) / 1000.0);
- break;
- case 1: /* Time UTC */
- sscanf(c,"%lf",&hmsd);
- hms = (int) hmsd;
- tm.tm_sec = hms % 100;
- hms = hms / 100;
- tm.tm_min = hms % 100;
- hms = hms / 100;
- tm.tm_hour = hms % 100;
- tm.tm_year=trackdate.tm_year;
- tm.tm_mon=trackdate.tm_mon;
- tm.tm_mday=trackdate.tm_mday;
- // This will probably be overwritten by field 9...if we have 9 fields.
- wpt->SetCreationTime(tx+((((time_t)tm.tm_hour * 60) + tm.tm_min) * 60) + tm.tm_sec);
- wpt->creation_time = wpt->creation_time.addMSecs(millisecs);
- if (global_opts.debug_level > 1) {
- time_t t = wpt->GetCreationTime().toTime_t();
- strftime(tbuffer, sizeof(tbuffer), "%c", gmtime(&t));
- printf("parsed timestamp: %s\n",tbuffer);
- }
- break;
-
- case 2: /* longitude */
- sscanf(c, "%lf", &wpt->longitude);
- break;
-
- case 3: /* latitude */
- sscanf(c, "%lf", &wpt->latitude);
- break;
- case 4: /* altitude */
- sscanf(c, "%lf", &wpt->altitude);
- break;
- case 5: /* speed */
- //sscanf(c, "%lf", &wpt->speed);
- wpt->speed=atof(c);
- if (global_opts.debug_level > 1) {
- printf("parsed speed: %8.5f\n",wpt->speed);
- }
- break;
- case 6: /* type of fix */
- sscanf(c, "%d", &fix);
- //my device shows only 0 or 2
- //should i guess from no of sats if 2d or 3d?
- switch (fix) {
- case 0:
- wpt->fix = fix_none;
- break;
- case 2:
- wpt->fix = fix_2d;
- break;
- //case 3: wpt->fix = fix_3d;break;
- //case 4: wpt->fix = fix_dgps;break; /* 2D_diff */
- //case 5: wpt->fix = fix_dgps;break; /* 3D_diff */
- default:
- wpt->fix = fix_unknown;
- break;
- }
- break;
- case 7: /* hdop */
- wpt->hdop = atof(c);
- //sscanf(c, "%lf", &wpt->hdop); does not work ???
- //wpt->vdop=0;wpt->hdop=0;
- break;
- case 8: /* number of sats */
- sscanf(c, "%d", &wpt->sat);
- break;
- // Somewhere around mid/late 2009, these files started
- // seeing 11 fields.
- case 9:
- memset(&tm2, 0, sizeof(tm2));
- if (!strptime(c, "%Y%m%d", &tm2)) {
- fatal("Bad date '%s'.\n", c);
- }
- wpt->creation_time = wpt->creation_time.addSecs(mkgmtime(&tm2));
- break;
- case 10: // Unknown. Ignored.
- case 11: // Bearing. Ignored.
- break;
- }
- c = csv_lineparse(nullptr, ",", "", column++);
- }
- line++;
-
- if ((wpt->fix != fix_none)&&(lat_old==0)) { //first-time init
- lat_old=wpt->latitude;
- //route_add_wpt(route, wpt);
- lastwpt=wpt;
- }
- //calculate the speed to reach this waypoint from the last. This way I try to sort out invalid waypoints
- double speed = 0;
- if (lastwpt !=nullptr) {
- speed=3.6*radtometers(gcdist(RAD(lastwpt->latitude), RAD(lastwpt->longitude), RAD(wpt->latitude), RAD(wpt->longitude))) /
- abs((int)(wpt->creation_time.toTime_t() - lastwpt->GetCreationTime().toTime_t()));
- //printf("speed line %d %lf \n",line,speed);
- }
- /* Error handling: in the tracklog of my device sometimes "jump" waypoints ;-) */
- if ((optclean) &&
- (((wpt->longitude==0.0)|| (wpt->latitude==0.0)||(std::abs(wpt->latitude)>90)||(std::abs(wpt->longitude)>180))||
- ((speed>maxspeed)||(speed<minspeed)))
- ) {
- if (global_opts.debug_level > 1) {
- fprintf(stderr,"Problem in or around line %5ld: \"%s\" %lf km/h\n",line,buff,speed);
- }
- } else {
- if (global_opts.debug_level > 1) {
- fprintf(stderr,"valid line %5ld: \"%s\" %lf km/h\n",line,buff,speed);
- }
- lastwpt=wpt;
- lat_old=wpt->latitude;
- route_add_wpt(route,wpt);
- waypt_add(new Waypoint(*wpt));
- }
- }
-}
-
-static void
-gopal_write_waypt(const Waypoint* wpt)
-{
- int fix=fix_unknown;
- //TICK; TIME; LONG; LAT; HEIGHT; SPEED; UN; HDOP; SAT
- //3801444, 080558, 2.944362, 43.262117, 295.28, 0.12964, 2, 2.900000, 3
- QString tbuffer = wpt->creation_time.toString("HHmmss");
- if (wpt->fix!=fix_unknown) {
- switch (wpt->fix) {
- case fix_none:
- fix = 0;
- break;
- case fix_2d:
- fix = 2;
- break;
- default:
- fix = 0;
- break;
- }
- }
- //MSVC handles time_t as int64, gcc and mac only int32, so convert it:
- unsigned long timestamp = (unsigned long)wpt->GetCreationTime().toTime_t();
- gbfprintf(fout, "%lu, %s, %lf, %lf, %5.1lf, %8.5lf, %d, %lf, %d\n",timestamp, CSTR(tbuffer), wpt->longitude, wpt->latitude,wpt->altitude,
- wpt->speed,fix,wpt->hdop,wpt->sat);
-}
-
-
-static void
-gopal_wr_init(const QString& fname)
-{
- fout = gbfopen(fname, "w", MYNAME);
-}
-
-static void
-gopal_wr_deinit()
-{
- gbfclose(fout);
-}
-
-static void
-gopal_write()
-{
- route_disp_all(nullptr, nullptr, gopal_write_waypt);
-}
-
-/**************************************************************************/
-
-// capabilities below means: we can only read and write waypoints
-//
-
-ff_vecs_t gopal_vecs = {
- ff_type_file,
- {
- ff_cap_none /* waypoints */,
- (ff_cap)(ff_cap_read | ff_cap_write) /* tracks */,
- ff_cap_none /* routes */
- },
- gopal_rd_init,
- gopal_wr_init,
- gopal_rd_deinit,
- gopal_wr_deinit,
- gopal_read,
- gopal_write,
- nullptr,
- &gopal_args,
- CET_CHARSET_ASCII, 0 /* ascii is the expected character set */
- /* not fixed, can be changed through command line parameter */
- , NULL_POS_OPS,
- nullptr
-};
-/**************************************************************************/
+++ /dev/null
-% Written by GPSManager 05-Apr-2002 21:52:36 (EST)
-% Edit at your own risk!
-
-!Format: DMS 1 WGS 84
-!Creation: no
-
-!W:
-GC894 N41 20 07.9 W85 24 31.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC1F78 N40 43 04.1 W85 06 25.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-003 N41 07 21.3 W85 09 23.5 symbol=boat_ramp alt=220.506469727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC93 N41 43 09.4 W85 58 59.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2193 N40 25 29.0 W86 54 52.0 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-004 N41 07 22.6 W85 09 24.3 symbol=flag alt=250.787719727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCA80 N40 29 14.3 W86 51 50.5 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC28CB N40 50 32.8 W85 25 20.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2665 N40 45 56.4 W85 35 58.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-005 N41 02 51.4 W85 16 41.6 symbol=flag alt=263.044433594 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCB78 N40 26 17.9 W86 54 02.2 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2ADC N40 26 16.4 W86 48 21.6 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-ABACUS N41 04 20.6 W85 13 50.8 symbol=building alt=243.577880859 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCD85 N41 05 03.3 W85 08 11.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCB8 N40 26 09.5 W87 09 49.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2BE8 N40 52 45.9 W85 32 26.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CASH1 N41 04 41.8 W85 08 19.3 symbol=flag alt=245.740844727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-H0ME N41 02 51.7 W85 16 42.1 symbol=house alt=272.176879883 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2C81 N41 12 24.2 W85 02 23.5 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CENCEN N41 41 39.0 W86 14 53.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-TOSB2 N41 44 00.4 W84 59 46.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2C90 N40 50 08.2 W85 27 14.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CWORK N41 07 23.0 W85 09 24.7 symbol=flag alt=254.633056641 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-TOSB3 N41 43 21.9 W86 15 20.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2C91 N41 05 01.4 W85 08 18.7 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB1 N41 40 34.1 W86 15 01.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-UNITA N41 02 52.2 W85 16 41.6 symbol=flag alt=256.795898438 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2F53 N41 43 57.0 W86 04 48.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB2 N41 38 10.3 W86 15 04.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC333A N41 01 42.7 W85 11 49.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB4 N41 37 27.7 W86 15 08.7 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB5 N41 38 53.4 W85 56 55.0 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC34D4 N41 58 16.8 W86 11 05.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB6 N41 34 46.3 W85 50 01.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC42A1 N41 05 02.1 W85 03 14.2 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC37C4 N41 38 15.5 W85 54 19.6 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB7 N41 07 42.2 W85 11 47.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC4378 N40 53 27.2 W85 28 13.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC11EF N40 01 45.3 W86 53 17.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC44E5 N41 01 03.7 W85 15 07.0 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC12FF N41 33 23.9 W86 21 26.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC47A5 N40 25 15.3 W86 54 17.6 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC17E0 N41 52 01.5 W86 36 12.5 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC488D N41 33 43.7 W85 50 18.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC1A9C N41 06 36.2 W85 09 20.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-
+++ /dev/null
-% Written by GPSManager 24-May-2002 13:51:04 (CST)
-% Edit at your own risk!
-
-!Format: DMM 1 WGS 84
-!Creation: no
-
-!W:
-!Position: DMS
-GC37C4 N41 38 15.5 W85 54 19.6 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-H0ME N41 02 51.7 W85 16 42.1 symbol=house alt=272.176879883 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC894 N41 20 07.9 W85 24 31.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB7 N41 07 42.2 W85 11 47.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2C81 N41 12 24.2 W85 02 23.5 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC1F78 N40 43 04.1 W85 06 25.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC4378 N40 53 27.2 W85 28 13.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-TOSB2 N41 44 00.4 W84 59 46.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CENCEN N41 41 39.0 W86 14 53.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-003 N41 07 21.3 W85 09 23.5 symbol=boat_ramp alt=220.506469727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC11EF N40 01 45.3 W86 53 17.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2C90 N40 50 08.2 W85 27 14.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC93 N41 43 09.4 W85 58 59.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC12FF N41 33 23.9 W86 21 26.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC44E5 N41 01 03.7 W85 15 07.0 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CWORK N41 07 23.0 W85 09 24.7 symbol=flag alt=254.633056641 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2193 N40 25 29.0 W86 54 52.0 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC47A5 N40 25 15.3 W86 54 17.6 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-TOSB3 N41 43 21.9 W86 15 20.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-004 N41 07 22.6 W85 09 24.3 symbol=flag alt=250.787719727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC17E0 N41 52 01.5 W86 36 12.5 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2C91 N41 05 01.4 W85 08 18.7 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCA80 N40 29 14.3 W86 51 50.5 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC488D N41 33 43.7 W85 50 18.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB1 N41 40 34.1 W86 15 01.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC28CB N40 50 32.8 W85 25 20.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC1A9C N41 06 36.2 W85 09 20.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-UNITA N41 02 52.2 W85 16 41.6 symbol=flag alt=256.795898438 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2665 N40 45 56.4 W85 35 58.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2F53 N41 43 57.0 W86 04 48.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-005 N41 02 51.4 W85 16 41.6 symbol=flag alt=263.044433594 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCB78 N40 26 17.9 W86 54 02.2 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB2 N41 38 10.3 W86 15 04.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2ADC N40 26 16.4 W86 48 21.6 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB4 N41 37 27.7 W86 15 08.7 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC333A N41 01 42.7 W85 11 49.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-ABACUS N41 04 20.6 W85 13 50.8 symbol=building alt=243.577880859 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB5 N41 38 53.4 W85 56 55.0 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCD85 N41 05 03.3 W85 08 11.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC34D4 N41 58 16.8 W86 11 05.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCB8 N40 26 09.5 W87 09 49.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB6 N41 34 46.3 W85 50 01.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC2BE8 N40 52 45.9 W85 32 26.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC42A1 N41 05 02.1 W85 03 14.2 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CASH1 N41 04 41.8 W85 08 19.3 symbol=flag alt=245.740844727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-
-!Position: DMM
-!R: 34
-!Position: DMS
-003 N41 07 21.3 W85 09 23.5 symbol=boat_ramp alt=220.506469727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-004 N41 07 22.6 W85 09 24.3 symbol=flag alt=250.787719727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-005 N41 02 51.4 W85 16 41.6 symbol=flag alt=263.044433594 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-ABACUS N41 04 20.6 W85 13 50.8 symbol=building alt=243.577880859 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CASH1 N41 04 41.8 W85 08 19.3 symbol=flag alt=245.740844727 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CENCEN N41 41 39.0 W86 14 53.3 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-CWORK N41 07 23.0 W85 09 24.7 symbol=flag alt=254.633056641 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-FRSB1 N41 40 34.1 W86 15 01.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC11EF N40 01 45.3 W86 53 17.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GCD85 N41 05 03.3 W85 08 11.1 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-
-!R: 23 Route 23
-!NB: blah blah blah
-
-GC11EF N40 01 45.3 W86 53 17.4 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC12FF N41 33 23.9 W86 21 26.9 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-GC1A9C N41 06 36.2 W85 09 20.8 alt=-0.114379882812 GD108:class=|c! GD108:colour=~|Z GD108:attrs=` GD108:depth=QY|c%|_i GD108:state=|cAA GD108:country=|cAA
-
+++ /dev/null
-/*
- Access gpsutil files.
-
- Copyright (C) 2002, 2003, 2004 Robert Lipe, robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-
-#include "defs.h"
-#include "cet_util.h"
-#include "magellan.h"
-#include <cmath>
-#include <cstdio>
-#include <cstdlib>
-
-static gbfile* file_in, *file_out;
-static short_handle mkshort_handle;
-
-#define MYNAME "GPSUTIL"
-
-static void
-rd_init(const QString& fname)
-{
- file_in = gbfopen(fname, "rb", MYNAME);
-}
-
-static void
-rd_deinit()
-{
- gbfclose(file_in);
-}
-
-static void
-wr_init(const QString& fname)
-{
- file_out = gbfopen(fname, "w", MYNAME);
- mkshort_handle = mkshort_new_handle();
-}
-
-static void
-wr_deinit()
-{
- gbfclose(file_out);
- mkshort_del_handle(&mkshort_handle);
-}
-
-static void
-data_read()
-{
- char* ibuf;
- char desc[31];
- double lat,lon;
- char latdir, londir;
- long alt;
- char alttype;
- char icon[3];
- int line = 0;
- /*
- * Make sure that all waypoints in single read have same
- * timestamp.
- */
- time_t now = current_time().toTime_t();
- icon[0] = 0;
-
- while ((ibuf = gbfgetstr(file_in))) {
- char* sn;
-
- if ((line++ == 0) && file_in->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
-
- /* A sharp in column zero or an blank line is a comment */
- ibuf = lrtrim(ibuf);
- int len = strlen(ibuf);
- if ((len == 0) || (*ibuf == '#')) {
- continue;
- }
-
- if (len > 71) {
- int offs = len - 71;
- sn = xstrndup(ibuf, offs + 8);
- ibuf += (offs + 9);
- } else {
- sn = xstrndup(ibuf, 8);
- ibuf += 9;
- }
-
- int n = sscanf(ibuf, "%lf%c %lf%c %ld%c %30[^,] %2s",
- &lat, &latdir, &lon, &londir,
- &alt, &alttype, desc, icon);
- /* Require at least first three fields, otherwise ignore */
- if (n < 2) {
- xfree(sn);
- continue;
- }
- rtrim(sn);
- rtrim(desc);
- rtrim(icon);
- auto* wpt_tmp = new Waypoint;
- wpt_tmp->altitude = alt;
- wpt_tmp->shortname = sn;
- xfree(sn);
- wpt_tmp->description = desc;
- wpt_tmp->SetCreationTime(now);
-
- if (latdir == 'S') {
- lat = -lat;
- }
- if (londir == 'W') {
- lon = -lon;
- }
-
- lat /= 100.0;
- lon /= 100.0;
- int ilon = (int)(lon);
- wpt_tmp->longitude = ilon + (lon - ilon)*(100.0/60.0);
- int ilat = (int)(lat);
- wpt_tmp->latitude = ilat + (lat - ilat) * (100.0/60.0);
- wpt_tmp->icon_descr = mag_find_descr_from_token(icon);
- waypt_add(wpt_tmp);
- }
-}
-
-static void
-gpsutil_disp(const Waypoint* wpt)
-{
- char* tdesc = xstrdup(wpt->description);
-
- QString icon_token = mag_find_token_from_descr(wpt->icon_descr);
-
- double lon = degrees2ddmm(wpt->longitude);
- double lat = degrees2ddmm(wpt->latitude);
-
- gbfprintf(file_out, "%-8.8s %08.3f%c %09.3f%c %07.0f%c %-30.30s %s\n",
- global_opts.synthesize_shortnames ?
- CSTRc(mkshort_from_wpt(mkshort_handle, wpt)) :
- CSTRc(wpt->shortname),
- fabs(lat),
- lat < 0.0 ? 'S' : 'N',
- fabs(lon),
- lon < 0.0 ? 'W' : 'E',
- ((wpt->altitude == unknown_alt) ||
- (wpt->altitude < 0.0)) ? 0 : wpt->altitude,
- 'm',
- CSTRc(wpt->description) ? tdesc : "",
- CSTR(icon_token));
-
- xfree(tdesc);
-}
-
-static void
-data_write()
-{
- waypt_disp_all(gpsutil_disp);
-}
-
-
-ff_vecs_t gpsutil_vecs = {
- ff_type_file,
- FF_CAP_RW_WPT,
- rd_init,
- wr_init,
- rd_deinit,
- wr_deinit,
- data_read,
- data_write,
- nullptr,
- nullptr,
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
"# IFIELD GMT_TIME, \"\", \"%a %b %d %H:%M:%S %Y\"\n"
"IFIELD LOCAL_TIME, \"\", \"%a %b %d %H:%M:%S %Y\"\n"
;
-static char gpsman[] =
- "# gpsbabel XCSV style file\n"
- "#\n"
- "# Format: GPSMAN Format\n"
- "# Author: Alex Mottram\n"
- "# Date: 12/09/2002\n"
- "#\n"
- "#\n"
- "# As defined in gpsman.c\n"
- "#\n"
- "#\n"
-
- "DESCRIPTION GPSman\n"
- "SHORTLEN 8\n"
- "SHORTWHITE 0\n"
-
- "# FILE LAYOUT DEFINITIIONS:\n"
- "#\n"
- "FIELD_DELIMITER TAB\n"
- "RECORD_DELIMITER NEWLINE\n"
- "BADCHARS TAB\n"
-
- "PROLOGUE !Format: DDD 1 WGS 84\n"
- "PROLOGUE !W:\n"
-
- "#\n"
- "# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:\n"
- "#\n"
- "IFIELD SHORTNAME, \"\", \"%-8.8s\"\n"
- "IFIELD DESCRIPTION, \"\", \"%s\"\n"
- "IFIELD LAT_DIRDECIMAL, \"\", \"%c%f\"\n"
- "IFIELD LON_DIRDECIMAL, \"\", \"%c%f\"\n"
- "IFIELD IGNORE, \"\", \"%s\"\n"
-
- "# gpsman.c likes mkshort len = 8, whitespace = 0.\n"
- ;
static char iblue747[] =
"# GPSBabel XCSV Style File https://www.gpsbabel.org/htmldoc-development/Styles.html\n"
"# Author: Christian Barmala http://www.barmala.de/\n"
"IFIELD SHORTNAME, \"\", \"%s\"\n"
"IFIELD CONSTANT, \"2\", \"%s\"\n"
;
-const QVector<style_vecs_t> style_list = {{ "tomtom_itn_places", tomtom_itn_places }, { "tomtom_itn", tomtom_itn }, { "tomtom_asc", tomtom_asc }, { "tabsep", tabsep }, { "saplus", saplus }, { "s_and_t", s_and_t }, { "ricoh", ricoh }, { "openoffice", openoffice }, { "nima", nima }, { "navigonwpt", navigonwpt }, { "mxf", mxf }, { "motoactv", motoactv }, { "mapconverter", mapconverter }, { "mainnav", mainnav }, { "land_air_sea", land_air_sea }, { "kompass_wp", kompass_wp }, { "kompass_tk", kompass_tk }, { "igoprimo_poi", igoprimo_poi }, { "igo2008_poi", igo2008_poi }, { "iblue757", iblue757 }, { "iblue747", iblue747 }, { "gpsman", gpsman }, { "gpsdrivetrack", gpsdrivetrack }, { "gpsdrive", gpsdrive }, { "geonet", geonet }, { "garmin_poi", garmin_poi }, { "garmin_g1000", garmin_g1000 }, { "garmin301", garmin301 }, { "fugawi", fugawi }, { "flysight", flysight }, { "dna", dna }, { "custom", custom }, { "cup", cup }, { "csv", csv }, { "cambridge", cambridge }, { "arc", arc }};
+const QVector<style_vecs_t> style_list = {{ "tomtom_itn_places", tomtom_itn_places }, { "tomtom_itn", tomtom_itn }, { "tomtom_asc", tomtom_asc }, { "tabsep", tabsep }, { "saplus", saplus }, { "s_and_t", s_and_t }, { "ricoh", ricoh }, { "openoffice", openoffice }, { "nima", nima }, { "navigonwpt", navigonwpt }, { "mxf", mxf }, { "motoactv", motoactv }, { "mapconverter", mapconverter }, { "mainnav", mainnav }, { "land_air_sea", land_air_sea }, { "kompass_wp", kompass_wp }, { "kompass_tk", kompass_tk }, { "igoprimo_poi", igoprimo_poi }, { "igo2008_poi", igo2008_poi }, { "iblue757", iblue757 }, { "iblue747", iblue747 }, { "gpsdrivetrack", gpsdrivetrack }, { "gpsdrive", gpsdrive }, { "geonet", geonet }, { "garmin_poi", garmin_poi }, { "garmin_g1000", garmin_g1000 }, { "garmin301", garmin301 }, { "fugawi", fugawi }, { "flysight", flysight }, { "dna", dna }, { "custom", custom }, { "cup", cup }, { "csv", csv }, { "cambridge", cambridge }, { "arc", arc }};
#else /* CSVFMTS_ENABLED */
const QVector<style_vecs_t> style_list;
#endif /* CSVFMTS_ENABLED */
+++ /dev/null
-/*
-
- Support for XML files from jogmap.de
-
- Copyright (C) 2009 Robert Lipe robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-*/
-
-
-#include "defs.h"
-#include "garmin_tables.h"
-#include "jeeps/gpsmath.h"
-#include "xmlgeneric.h"
-#include <QXmlStreamAttributes>
-
-static route_head* trk;
-
-static QVector<arglist_t> jogmap_args = {
-};
-
-#define MYNAME "xol"
-
-// static xg_callback jogmap_shape, xol_shape_end;
-// static xg_callback jogmap_waypt, xol_overlay;
-
-#define XOL "/overlays/overlay"
-
-
-
-static void
-jogmap_markers(xg_string, const QXmlStreamAttributes*)
-{
- trk = new route_head;
- track_add_head(trk);
-}
-
-static void
-jogmap_marker(xg_string, const QXmlStreamAttributes* attrv)
-{
- auto* wpt = new Waypoint;
-
- if (attrv->hasAttribute("lat")) {
- wpt->latitude = attrv->value("lat").toString().toDouble();
- }
-
- if (attrv->hasAttribute("lng")) {
- wpt->longitude = attrv->value("lng").toString().toDouble();
- }
-
- if (trk) {
- track_add_wpt(trk, wpt);
- }
-}
-
-static
-xg_tag_mapping jogmap_map[] = {
- { jogmap_markers, cb_start, "/markers" },
- { jogmap_marker, cb_start, "/markers/marker" },
- { nullptr, (xg_cb_type)0, nullptr }
-};
-
-static void
-jogmap_rd_init(const QString& fname)
-{
- trk = nullptr;
- xml_init(fname, jogmap_map, nullptr);
-}
-
-static void
-jogmap_read()
-{
- xml_read();
-}
-
-static void
-jogmap_rd_deinit()
-{
- xml_deinit();
-}
-
-ff_vecs_t jogmap_vecs = {
- ff_type_file,
- {
- ff_cap_none, /* waypoints */
- ff_cap_read, /* tracks */
- ff_cap_none
- }, /* routes */
- jogmap_rd_init,
- nullptr,
- jogmap_rd_deinit,
- nullptr,
- jogmap_read,
- nullptr,
- nullptr,
- &jogmap_args,
- CET_CHARSET_UTF8, 0
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
-
- Support for the Jelbert GeoTagger JTR data file format.
-
- Copyright (C) 2008 Olaf Klein, o.b.klein@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-#include "defs.h"
-#include "csv_util.h"
-#include <QHash>
-//#include <cassert>
-#include <cmath>
-#include <cstdio>
-#include <cstdlib>
-#include "nmea.h"
-
-#define MYNAME "jtr"
-
-static
-QVector<arglist_t> jtr_args = {
-};
-
-static gbfile* fin, *fout;
-static QHash<QString, const Waypoint*> trkpts;
-
-void
-jtr_parse_date(const char* str, QDate& date)
-{
- int dmy = atoi(str);
- if (dmy > 0) {
- int year= dmy % 100 + 2000;
- dmy = dmy / 100;
- int month = dmy % 100;
- dmy = dmy / 100;
- int day = dmy;
- date = QDate(year, month, day);
- }
-}
-
-void
-jtr_parse_time(const char* str, QTime& time)
-{
- char* dot;
- long int hms = strtol(str, &dot, 10);
- int sec = hms % 100;
- hms = hms / 100;
- int min = hms % 100;
- hms = hms / 100;
- int hour = hms % 100;
-
- if (*dot == '.') {
- int milli = atoi(dot + 1) * 10;
- sec += milli / 1000;
- }
-
- time = QTime(hour, min, sec);
-}
-
-/*******************************************************************************
-* %%% global callbacks called by gpsbabel main process %%% *
-*******************************************************************************/
-
-static void
-jtr_rd_init(const QString& fname)
-{
- fin = gbfopen(fname, "r", MYNAME);
-}
-
-static void
-jtr_rd_deinit()
-{
- trkpts.clear();
- gbfclose(fin);
-}
-
-static void
-jtr_read()
-{
- char* str;
- int line = 0;
- route_head* trk = nullptr;
-
- while ((str = gbfgetstr(fin))) {
- QDate date;
- QTime time;
- char valid = 'V';
- double lon;
- float course, mcourse, mvar, mdev;
- char mdevdir;
-
- line++;
-
- str = lrtrim(str);
- if (*str == '\0') {
- continue;
- }
-
- if (strncmp(str, "GEOTAG2,", 8) != 0) {
- fatal(MYNAME ": Unknown or unsupported file (missing \"GEOTAG2\")!\n");
- }
-
- double lat = lon = 999;
- float speed = course = mcourse = mvar = mdev = -1;
- char mvardir = mdevdir = 0;
-
- int column = -1;
- char* tmp = str;
- while ((str = csv_lineparse(tmp, ",", "", column++))) {
- tmp = nullptr;
-
- if (*str == '\0') {
- continue;
- }
-
- switch (column) {
- case 0:
- break; /* GEOTAG2 */
- case 1:
- jtr_parse_time(str, time);
- break;
- case 2:
- valid = *str;
- break;
- case 3:
- lat = ddmm2degrees(atof(str));
- break;
- case 4:
- if (*str == 'S') {
- lat *= -1;
- }
- break;
- case 5:
- lon = ddmm2degrees(atof(str));
- break;
- case 6:
- if (*str == 'W') {
- lon *= -1;
- }
- break;
- case 7:
- speed = KNOTS_TO_MPS(atof(str));
- break;
- case 8:
- course = atof(str);
- break;
- case 9:
- jtr_parse_date(str, date);
- break;
- case 13:
- mcourse = atof(str);
- break;
- case 14:
- mdev = atof(str);
- break;
- case 15:
- mdevdir = *str;
- break;
- case 16:
- mvar = atof(str);
- break;
- case 17:
- mvardir = *str;
- break;
- default:
- break;
- }
- }
-
- if ((lat == 999) || (lon == 999) || (valid != 'A')) {
- continue;
- }
-
- QDateTime dt = QDateTime(date, time, Qt::UTC);
-
- /* check for duplicates as suggested in format description */
- QString buf = QString("%1\01%2\01%3")
- .arg(QString::number(lat, 'f', 6),
- QString::number(lon, 'f', 6),
- QString::number(dt.toSecsSinceEpoch()));
- if (trkpts.contains(buf)) {
- continue;
- }
-
- auto* wpt = new Waypoint;
-
- wpt->latitude = lat;
- wpt->longitude = lon;
- wpt->SetCreationTime(dt);
- if (speed >= 0) {
- WAYPT_SET(wpt, speed, speed);
- }
- if (mcourse >= 0) {
- course = mcourse;
- if (mvar >= 0) {
- if (mvardir == 'W') {
- course += mvar;
- } else if (mvardir == 'E') {
- course -= mvar;
- }
- }
- if (mdev >= 0) {
- if (mdevdir == 'W') {
- course += mdev;
- } else if (mdevdir == 'E') {
- course -= mdev;
- }
- }
- }
- if (course >= 0) {
- WAYPT_SET(wpt, course, course);
- }
-
- if (trk == nullptr) {
- trk = new route_head;
- track_add_head(trk);
- }
-
- trkpts.insert(buf, wpt);
- track_add_wpt(trk, wpt);
- }
-}
-
-static void
-jtr_wr_init(const QString& fname)
-{
- fout = gbfopen(fname, "wb", MYNAME);
-}
-
-static void
-jtr_wr_deinit()
-{
- gbfclose(fout);
-}
-
-static void
-jtr_trkpt_disp_cb(const Waypoint* wpt)
-{
- char* str, *tmp;
- char scourse[6], sspeed[8];
- QString sdate;
- QString stime;
-
- if (wpt->creation_time.isValid()) {
- gpsbabel::DateTime dt = wpt->GetCreationTime().toUTC();
-
- // round time to centiseconds.
- int msec = dt.time().msec();
- int csec = lround(msec/10.0);
- dt = dt.addMSecs(csec*10-msec);
- sdate = dt.toString(QStringLiteral("ddMMyy"));
- stime = dt.toString(QStringLiteral("HHmmss.zzz"));
- // toss milliseconds position which should now be zero.
- //assert(stime.endsWith('0'));
- stime.chop(1);
- // suppress fractional seconds if they are zero.
- stime = stime.replace(QLatin1String(".00"), QLatin1String(""));
- }
- if (WAYPT_HAS(wpt, speed) && (wpt->speed >= 0)) {
- snprintf(sspeed, sizeof(sspeed), "%.1f", MPS_TO_KNOTS(wpt->speed));
- } else {
- sspeed[0] = 0;
- }
- if (WAYPT_HAS(wpt, course) && (wpt->course >= 0)) {
- snprintf(scourse, sizeof(scourse), "%.1f", wpt->course);
- } else {
- scourse[0] = 0;
- }
-
- xasprintf(&str, "GEOTAG2,%s,%c,%09.4f,%c,%010.4f,%c,%s,%s,%s,,E,A",
- CSTR(stime),
- wpt->creation_time.isValid() ? 'A' : 'V',
- fabs(degrees2ddmm(wpt->latitude)),
- wpt->latitude < 0 ? 'S' : 'N',
- fabs(degrees2ddmm(wpt->longitude)),
- wpt->longitude < 0 ? 'W' : 'E',
- sspeed,
- scourse,
- CSTR(sdate));
-
- xasprintf(&tmp, "%s*%02X", str, NmeaFormat::nmea_cksum(str));
- xfree(str);
- str = tmp;
-
- xasprintf(&tmp, "%s,,,E,,E*%02X\r", str, NmeaFormat::nmea_cksum(str));
- xfree(str);
- str = tmp;
-
- gbfputs(str, fout);
- xfree(str);
-}
-
-static void
-jtr_write()
-{
- track_disp_all(nullptr, nullptr, jtr_trkpt_disp_cb);
-}
-
-/**************************************************************************/
-
-ff_vecs_t jtr_vecs = {
- ff_type_file,
- {
- ff_cap_none, /* waypoints */
- (ff_cap)(ff_cap_read | ff_cap_write), /* tracks */
- ff_cap_none /* routes */
- },
- jtr_rd_init,
- jtr_wr_init,
- jtr_rd_deinit,
- jtr_wr_deinit,
- jtr_read,
- jtr_write,
- nullptr,
- &jtr_args,
- CET_CHARSET_ASCII, 0 /* ascii is the expected character set */
- /* not fixed, can be changed through command line parameter */
- , NULL_POS_OPS,
- nullptr
-};
-
-/**************************************************************************/
+++ /dev/null
-/*
- Magellan ".gs" files as they appear on USB of Explorist 400,500,600.
-
- Copyright (C) 2005, 2006, 2008 robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include "defs.h"
-#include "csv_util.h"
-#include "magellan.h"
-#include <QXmlStreamAttributes>
-#include <cmath>
-#include <cstdio>
-#include <cstdlib>
-
-#define MYNAME "maggeo"
-
-/* Turn this on (remove) after 5.2 becomes widespread. */
-#define FIRMWARE_DOES_88591 0
-
-static gbfile* maggeofile_in;
-static gbfile* maggeofile_out;
-static short_handle desc_handle = nullptr;
-
-static QDateTime maggeo_parsedate(char* dmy);
-
-static void
-maggeo_writemsg(const char* const buf)
-{
- unsigned int osum = mag_checksum(buf);
- gbfprintf(maggeofile_out, "$%s*%02X\r\n",buf, osum);
-}
-
-static void
-maggeo_rd_init(const QString& fname)
-{
- maggeofile_in = gbfopen(fname, "rb", MYNAME);
-}
-
-static void
-maggeo_rd_deinit()
-{
- gbfclose(maggeofile_in);
-}
-
-static void
-maggeo_wr_init(const QString& fname)
-{
- if (waypt_count() > 200) {
- fatal(MYNAME ": eXplorist does not support more than 200 waypoints in one .gs file.\nDecrease the number of waypoints sent.\n");
- }
- maggeofile_out = gbfopen(fname, "wb", MYNAME);
- desc_handle = mkshort_new_handle();
- setshort_length(desc_handle, 20);
- setshort_badchars(desc_handle, "\"$,");
-}
-
-static void
-maggeo_wr_deinit()
-{
- maggeo_writemsg("PMGNCMD,END");
- mkshort_del_handle(&desc_handle);
- gbfclose(maggeofile_out);
-}
-
-static void
-maggeo_read()
-{
- char* buff;
-
- while ((buff = gbfgetstr(maggeofile_in))) {
- char* s = nullptr;
-
- buff = lrtrim(buff);
- if (*buff == '\0') {
- continue;
- }
- if (strncmp(buff, "$PMGNGEO,", 9)) {
- continue;
- }
-
- buff += 9; /* skip field no. 1 */
- int fld = 1;
-
- auto* wpt_tmp = new Waypoint;
- geocache_data* gcdata = wpt_tmp->AllocGCData();
-
- while ((s = csv_lineparse(buff, ",", "", fld++))) {
- buff = nullptr;
-
- s = lrtrim(s);
- if (*s == '\0') {
- continue;
- }
-
- switch (fld) {
- case 2:
- wpt_tmp->latitude = ddmm2degrees(atof(s));
- break;
- case 3:
- if (s[0] == 'S') {
- wpt_tmp->latitude = -wpt_tmp->latitude;
- }
- break;
- case 4:
- wpt_tmp->longitude = ddmm2degrees(atof(s));
- break;
- case 5:
- if (s[0] == 'W') {
- wpt_tmp->longitude = -wpt_tmp->longitude;
- }
- break;
- case 6:
- wpt_tmp->altitude = atof(s);
- break;
- case 7:
- if (s[0] == 'F') {
- wpt_tmp->altitude = METERS_TO_FEET(wpt_tmp->altitude);
- }
- break;
- case 8:
- wpt_tmp->shortname = s;
- break;
- case 9:
- wpt_tmp->description = s;
- break;
- case 10:
- gcdata->placer = s;
- break;
- case 11:
- gcdata->hint = s;
- break;
- case 12: // cache type
- if (strcmp(s, "Mystery Cache") == 0) {
- gcdata->type = gt_surprise;
- } else {
- gcdata->type = gs_mktype(s);
- }
- break;
- case 13:
- wpt_tmp->creation_time = maggeo_parsedate(s);
- break;
- case 14: // last found date was ignored. Implemented 2013-02-27.
- gcdata->last_found = maggeo_parsedate(s);
- break;
- case 15:
- gcdata->diff = 10 * atof(s);
- break;
- case 16:
- gcdata->terr = 10 * atof(s);
- break;
- }
- }
- waypt_add(wpt_tmp);
- }
-
-}
-
-static
-QString
-maggeo_fmtdate(const QDateTime& dt)
-{
- QDate date = dt.date();
- int y = date.year() - 1900;
- int m = date.month();
- int d = date.day();
- int r = d * 100000 + m * 1000 + y;
- return QString("%1").arg(r, 7, 10, QChar('0'));
-}
-
-/*
- * The maggeo date format s DDMMYYY where "YYY" is the number
- * of years since 1900. This, of course, means anything in this
- * century is three digits but anything from before 2000, we'd have
- * two digit years. This makes this easier to parse as strings.
- */
-static QDateTime maggeo_parsedate(char* dmy)
-{
- QString date(dmy);
- int d = date.mid(0,2).toInt();
- int m = date.mid(2,2).toInt();
- int y = date.mid(4,3).toInt();
-#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
- QDateTime r(QDate(y + 1900, m, d));
-#else
- QDateTime r = QDate(y + 1900, m, d).startOfDay();
-#endif
- return r;
-}
-
-/*
- * Append an optional UTF string to buf, prepending a comma,
- * cleansing it of NMEA-isms and decomposing to ASCII as we go.
- */
-static
-void
-append(char* buf, const char* str)
-{
- char* cleansed2;
-
- strcat(buf, ",");
-
- if (!str) {
- return;
- }
-
- char* cleansed1 = xstrdup(str);
-#if FIRMWARE_DOES_88591
- /* Actually, this function needs needs refactored... */
- cleansed2 = xstrdup(cleansed1);
-#else
- cleansed2 = xstrdup(m330_cleanse(cleansed1));
-#endif
-
- strcat(buf, cleansed2);
-
-
- xfree(cleansed1);
- xfree(cleansed2);
-
-}
-
-static void
-maggeo_waypt_pr(const Waypoint* waypointp)
-{
- char obuf[4096];
- const char* ctype = nullptr;
-
- double ilat = waypointp->latitude;
- double ilon = waypointp->longitude;
-
- double lon = fabs(ilon);
- double lat = fabs(ilat);
-
- int lon_deg = lon;
- int lat_deg = lat;
-
- lon = (lon - lon_deg) * 60.0;
- lat = (lat - lat_deg) * 60.0;
-
- lon = (lon_deg * 100.0 + lon);
- lat = (lat_deg * 100.0 + lat);
-
- /*
- * For some reason, Magellan used exactly the GPX spellings of
- * everything except this one...
- */
- if (waypointp->gc_data->type == gt_surprise) {
- ctype = "Mystery Cache";
- } else {
- ctype = gs_get_cachetype(waypointp->gc_data->type);
- }
- QString placeddate = maggeo_fmtdate(waypointp->creation_time);
- QString lfounddate = maggeo_fmtdate(waypointp->gc_data->last_found);
- QString cname = mkshort(desc_handle,
- waypointp->notes.isEmpty() ? waypointp->description : waypointp->notes);
- QString placer = waypointp->gc_data->placer;
-
- /*
- * As of this writing on 05/04, the firmware in the units will
- * let you write fields of just about any width, but appears to
- * only use the following:
- * shortname - 8 chars
- * cname - 20 chars (scrolls in some places, not others)
- * placer - display limited by width
- * hint - 50 chars
- * cache type - appears to be parsed by f/w for icon matching.
- *
- *
- */
- snprintf(obuf, sizeof(obuf),
- "PMGNGEO,%4.3f,%c,%08.3f,%c,%04.0f,F",
- lat, ilat < 0 ? 'S' : 'N',
- lon, ilon < 0 ? 'W' : 'E',
- waypointp->altitude == unknown_alt ?
- 0 : waypointp->altitude);
- append(obuf, CSTRc(waypointp->shortname));
- append(obuf, CSTR(cname));
- append(obuf, CSTR(placer));
- append(obuf, CSTR(waypointp->gc_data->hint));
- append(obuf, ctype);
- append(obuf, placeddate.toUtf8());
- append(obuf, lfounddate.toUtf8());
-
- if (waypointp->gc_data->diff/10.0)
- sprintf(obuf + strlen(obuf), ",%3.1f",
- waypointp->gc_data->diff/10.0);
- else {
- strcat(obuf, ",");
- }
-
- if (waypointp->gc_data->terr/10.0)
- sprintf(obuf + strlen(obuf), ",%3.1f",
- waypointp->gc_data->terr/10.0);
- else {
- strcat(obuf, ",");
- }
-
- maggeo_writemsg(obuf);
-}
-
-static void
-maggeo_write()
-{
- waypt_disp_all(maggeo_waypt_pr);
-}
-
-ff_vecs_t maggeo_vecs = {
- ff_type_file,
- { (ff_cap)(ff_cap_read | ff_cap_write), ff_cap_none, ff_cap_none },
- maggeo_rd_init,
- maggeo_wr_init,
- maggeo_rd_deinit,
- maggeo_wr_deinit,
- maggeo_read,
- maggeo_write,
- nullptr,
- nullptr,
-#if FIRMWARE_DOES_88591
- CET_CHARSET_LATIN1, 0 /* CET-REVIEW */
-#else
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
-#endif
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- Access Magellan Mapsend files.
-
- Copyright (C) 2002-2006 Robert Lipe, robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include <cmath> // for lround
-#include <cstdio> // for sprintf
-#include <cstdlib> // for atoi
-#include <cstring> // for strncpy
-#include <ctime>
-
-#include <QString> // for QString
-#include <QTime> // for QTime
-#include <QtGlobal> // for Q_UNUSED
-
-#include "defs.h"
-#include "mapsend.h"
-#include "gbfile.h" // for gbfputint32, gbfgetint32, gbfgetdbl, gbfputdbl, gbfgetpstr, gbfwrite, gbfputpstr, gbfputc, gbfread, gbfclose, gbfgetc, gbfgetflt, gbfopen, gbfputflt, gbfile, gbfgetuint32, gbfopen_le, gbsize_t
-#include "magellan.h" // for mag_find_token_from_descr, mag_find_descr_from_token
-#include "src/core/datetime.h" // for DateTime
-
-
-static gbfile* mapsend_file_in;
-static gbfile* mapsend_file_out;
-static short_handle mkshort_handle;
-static short_handle wpt_handle;
-
-static int route_wp_count;
-static int mapsend_infile_version;
-static int trk_version = 30;
-
-#define MYNAME "mapsend"
-
-static char* mapsend_opt_trkver = nullptr;
-#define MAPSEND_TRKVER_MIN 3
-#define MAPSEND_TRKVER_MAX 4
-
-static
-QVector<arglist_t> mapsend_args = {
- {
- "trkver", &mapsend_opt_trkver,
- "MapSend version TRK file to generate (3,4)",
- "4", ARGTYPE_INT, "3", "4", nullptr
- },
-};
-
-static void
-mapsend_init_opts(const char isReading) /* 1=read, 2=write */
-{
- /* read & write options here */
-
- if (isReading) {
- /* reading-only options here */
- } else {
- /* writing-only options here */
-
- // TRK MapSend version
- int opt_trkver = atoi(mapsend_opt_trkver);
- if ((opt_trkver < MAPSEND_TRKVER_MIN) || (opt_trkver > MAPSEND_TRKVER_MAX)) {
- fatal(MYNAME ": Unsupported MapSend TRK version \"%s\"!\n", mapsend_opt_trkver);
- }
- trk_version = opt_trkver * 10;
- }
-}
-
-static void
-mapsend_rd_init(const QString& fname)
-{
- mapsend_init_opts(1);
- mapsend_file_in = gbfopen_le(fname, "rb", MYNAME);
-}
-
-static void
-mapsend_rd_deinit()
-{
- gbfclose(mapsend_file_in);
-}
-
-static void
-mapsend_wr_init(const QString& fname)
-{
- mapsend_init_opts(0);
- mapsend_file_out = gbfopen(fname, "wb", MYNAME);
- mkshort_handle = mkshort_new_handle();
-
- wpt_handle = mkshort_new_handle();
- setshort_whitespace_ok(wpt_handle, 1);
- setshort_length(wpt_handle, 8);
-
- route_wp_count = 0;
-}
-
-static void
-mapsend_wr_deinit()
-{
- gbfclose(mapsend_file_out);
- mkshort_del_handle(&mkshort_handle);
- mkshort_del_handle(&wpt_handle);
-}
-
-static void
-mapsend_wpt_read()
-{
- char tbuf[256];
- char wpt_icon;
- Waypoint* wpt_tmp;
-
- int wpt_count = gbfgetint32(mapsend_file_in);
-
- while (wpt_count--) {
- wpt_tmp = new Waypoint;
-
- wpt_tmp->shortname = gbfgetpstr(mapsend_file_in);
- wpt_tmp->description = gbfgetpstr(mapsend_file_in);
-
- int wpt_number = gbfgetint32(mapsend_file_in);
- (void) wpt_number; // hush warning.
- wpt_icon = gbfgetc(mapsend_file_in);
- char wpt_status = gbfgetc(mapsend_file_in);
- (void) wpt_status; // hush warning.
-
- wpt_tmp->altitude = gbfgetdbl(mapsend_file_in);
- wpt_tmp->longitude = gbfgetdbl(mapsend_file_in);
- wpt_tmp->latitude = -gbfgetdbl(mapsend_file_in);
-
- if (wpt_icon < 26) {
- sprintf(tbuf, "%c", wpt_icon + 'a');
- } else {
- sprintf(tbuf, "a%c", wpt_icon - 26 + 'a');
- }
- wpt_tmp->icon_descr = mag_find_descr_from_token(tbuf);
-
- waypt_add(wpt_tmp);
- }
-
- /* now read the routes... */
- int rte_count = gbfgetint32(mapsend_file_in);
-
- while (rte_count--) {
- auto* rte_head = new route_head;
- route_add_head(rte_head);
-
- /* route name */
- rte_head->rte_name = gbfgetpstr(mapsend_file_in);
-
- /* route # */
- int rte_num = gbfgetint32(mapsend_file_in);
- rte_head->rte_num = rte_num;
-
- /* points this route */
- wpt_count = gbfgetint32(mapsend_file_in);
-
- while (wpt_count--) {
- wpt_tmp = new Waypoint;
-
- /* waypoint name */
- wpt_tmp->shortname = gbfgetpstr(mapsend_file_in);
-
- /* waypoint # */
- int wpt_number = gbfgetint32(mapsend_file_in);
- Q_UNUSED(wpt_number)
- wpt_tmp->longitude = gbfgetdbl(mapsend_file_in);
- wpt_tmp->latitude = -gbfgetdbl(mapsend_file_in);
-
- gbfread(&wpt_icon, 1, sizeof(wpt_icon), mapsend_file_in);
-
- if (wpt_icon < 26) {
- sprintf(tbuf, "%c", wpt_icon + 'a');
- } else {
- sprintf(tbuf, "a%c", wpt_icon - 26 + 'a');
- }
- wpt_tmp->icon_descr = mag_find_descr_from_token(tbuf);
-
- route_add_wpt(rte_head, wpt_tmp);
- }
- }
-}
-
-static void
-mapsend_track_read()
-{
- auto* track_head = new route_head;
- track_head->rte_name = gbfgetpstr(mapsend_file_in);
- track_add_head(track_head);
-
- unsigned int trk_count = gbfgetuint32(mapsend_file_in);
-
- while (trk_count--) {
- auto* wpt_tmp = new Waypoint;
-
- wpt_tmp->longitude = gbfgetdbl(mapsend_file_in);
- wpt_tmp->latitude = -gbfgetdbl(mapsend_file_in);
-
- if (mapsend_infile_version < 36) { /* < version 4.0 */
- wpt_tmp->altitude = gbfgetint32(mapsend_file_in);
- } else {
- wpt_tmp->altitude = gbfgetflt(mapsend_file_in);
- }
- if (wpt_tmp->altitude < unknown_alt + 1) {
- wpt_tmp->altitude = unknown_alt;
- }
- time_t t = gbfgetint32(mapsend_file_in);
- int32_t valid = gbfgetint32(mapsend_file_in);
- Q_UNUSED(valid);
-
- /* centiseconds only in >= version 3.0 */
- unsigned char centisecs;
- if (mapsend_infile_version >= 34) {
- gbfread(¢isecs, 1, 1, mapsend_file_in);
- } else {
- centisecs = 0;
- }
- wpt_tmp->SetCreationTime(t, 10 * centisecs);
-
- track_add_wpt(track_head, wpt_tmp);
- }
-}
-
-static void
-mapsend_read()
-{
- mapsend_hdr hdr;
- char buf[3];
-
- /*
- * Because of the silly struct packing and the goofy variable-length
- * strings, each member has to be read in one at a time. Grrr.
- */
-
- gbsize_t len = gbfread(&hdr, 1, sizeof(hdr), mapsend_file_in);
- is_fatal(len < sizeof(hdr), MYNAME ": No mapsend or empty file!");
-
- int type = le_read16(&hdr.ms_type);
- strncpy(buf, hdr.ms_version, 2);
- buf[2] = '\0';
-
- mapsend_infile_version = atoi(buf);
-
- switch (type) {
- case ms_type_wpt:
- mapsend_wpt_read();
- break;
- case ms_type_track:
- mapsend_track_read();
- break;
- case ms_type_log:
- fatal(MYNAME ", GPS logs not supported.\n");
- case ms_type_rgn:
- fatal(MYNAME ", GPS regions not supported.\n");
- default:
- fatal(MYNAME ", unknown file type %d\n", type);
- }
-}
-
-
-static void
-mapsend_waypt_pr(const Waypoint* waypointp)
-{
- static int cnt = 0;
- QString sn = global_opts.synthesize_shortnames ?
- mkshort_from_wpt(mkshort_handle, waypointp) :
- waypointp->shortname;
-
- /*
- * The format spec doesn't call out the character set of waypoint
- * name and description. Empirically, we can see that it's 8859-1,
- * but if we create mapsend files containing those, Mapsend becomes
- * grumpy uploading the resulting waypoints and being unable to deal
- * with the resulting comm errors.
- *
- * Ironically, our own Magellan serial module strips the "naughty"
- * characters, keeping it more in definition with their own serial
- * spec. :-)
- *
- * So we just decompose the utf8 strings to ascii before stuffing
- * them into the Mapsend file.
- */
-
-
- QString tmp1 = mkshort(wpt_handle, sn);
- gbfputpstr(tmp1, mapsend_file_out);
-
- // This is funny looking to ensure that no more than 30 bytes
- // get written to the file.
- unsigned int c = waypointp->description.length();
- if (c > 30) {
- c = 30;
- }
- gbfputc(c, mapsend_file_out);
- gbfwrite(CSTR(waypointp->description), 1, c, mapsend_file_out);
-
- /* #, icon, status */
- gbfputint32(++cnt, mapsend_file_out);
-
-
- QString iconp;
- if (!waypointp->icon_descr.isNull()) {
- iconp = mag_find_token_from_descr(waypointp->icon_descr);
- if (1 == iconp.size()) {
- c = iconp[0].toLatin1() - 'a';
- } else {
- c = iconp[1].toLatin1() - 'a' + 26;
- }
- } else {
- c = 0;
- }
- if (get_cache_icon(waypointp)) {
- iconp = mag_find_token_from_descr(get_cache_icon(waypointp));
- if (1 == iconp.size()) {
- c = iconp[0].toLatin1() - 'a';
- } else {
- c = iconp[1].toLatin1() - 'a' + 26;
- }
- }
-
- gbfputc(c, mapsend_file_out);
- gbfputc(1, mapsend_file_out);
-
- double falt = waypointp->altitude;
- if (falt == unknown_alt) {
- falt = 0;
- }
- gbfputdbl(falt, mapsend_file_out);
-
- gbfputdbl(waypointp->longitude, mapsend_file_out);
- gbfputdbl(-waypointp->latitude, mapsend_file_out);
-}
-
-static void
-mapsend_route_hdr(const route_head* rte)
-{
- QString rname;
- QString r = rte->rte_name;
-
- /* route name -- mapsend really seems to want something here.. */
- if (r.isEmpty()) {
- rname = "Route";
- } else {
- rname = CSTRc(rte->rte_name);
- }
- gbfputpstr(rname, mapsend_file_out);
-
- /* route # */
- gbfputint32(rte->rte_num, mapsend_file_out);
-
- /* # of waypoints to follow... */
- gbfputint32(rte->rte_waypt_ct(), mapsend_file_out);
-}
-
-static void
-mapsend_route_disp(const Waypoint* waypointp)
-{
- unsigned char c;
-
- route_wp_count++;
-
- /* waypoint name */
- gbfputpstr(waypointp->shortname, mapsend_file_out);
-
- /* waypoint number */
- gbfputint32(route_wp_count, mapsend_file_out);
-
- gbfputdbl(waypointp->longitude, mapsend_file_out);
- gbfputdbl(-waypointp->latitude, mapsend_file_out);
-
- if (!waypointp->icon_descr.isNull()) {
- QString iconp = mag_find_token_from_descr(waypointp->icon_descr);
- if (1 == iconp.size()) {
- c = iconp[0].toLatin1() - 'a';
- } else {
- c = iconp[1].toLatin1() - 'a' + 26;
- }
- } else {
- c = 0;
- }
- gbfwrite(&c, 1, 1, mapsend_file_out);
-}
-
-static void mapsend_track_hdr(const route_head* trk)
-{
- /*
- * we write mapsend v3.0 tracks as mapsend v2.0 tracks get
- * tremendously out of whack time/date wise.
- */
- const char* verstring = "30";
- mapsend_hdr hdr = {13, {'4','D','5','3','3','3','3','4',' ','M','S'},
- {'3','0'}, ms_type_track, {0, 0, 0}
- };
-
- switch (trk_version) {
- case 20:
- verstring = "30";
- break;
- case 30:
- verstring = "34";
- break;
- case 40:
- /* the signature seems to change with the versions, even though it
- * shouldn't have according to the document. MapSend V4 doesn't
- * like the old version.
- */
- hdr.ms_signature[7] = '6';
- verstring = "36";
- break;
- default:
- fatal("Unknown track version.\n");
- break;
- }
-
- hdr.ms_version[0] = verstring[0];
- hdr.ms_version[1] = verstring[1];
-
- gbfwrite(&hdr, sizeof(hdr), 1, mapsend_file_out);
- QString tname = trk->rte_name.isEmpty() ? "Track" : trk->rte_name;
- gbfputpstr(tname, mapsend_file_out);
-
- /* total nodes (waypoints) this track */
- int i = trk->rte_waypt_ct();
-
- gbfputint32(i, mapsend_file_out);
-
-}
-
-static void mapsend_track_disp(const Waypoint* wpt)
-{
- unsigned char c;
- static int last_time;
-
- /*
- * Firmware Ver 4.06 (at least) has a defect when it's set for .01km
- * tracking that will sometimes result in timestamps in the track
- * going BACKWARDS. When mapsend sees this, it (stupidly) advances
- * the date by one, ignoring the date on the TRK lines. This looks
- * for time travel and just uses the previous time - it's better to
- * be thought to be standing still than to be time-travelling!
- *
- * This is rumoured (but yet unconfirmed) to be fixed in f/w 5.12.
- */
- int32_t t = wpt->GetCreationTime().toTime_t();
- if (t < last_time) {
- t = last_time;
- }
-
- /* x = longitude */
- gbfputdbl(wpt->longitude, mapsend_file_out);
-
- /* x = latitude */
- gbfputdbl(-wpt->latitude, mapsend_file_out);
-
- /* altitude
- * in V4.0+ this field is a float, it was previously an int
- */
- if (trk_version < 40) {
- gbfputint32((int) wpt->altitude, mapsend_file_out);
- } else {
- gbfputflt((float) wpt->altitude, mapsend_file_out);
- }
-
- /* time */
- gbfputint32(t, mapsend_file_out);
- last_time = t;
-
- /* validity */
- gbfputint32(1, mapsend_file_out);
-
- /* 0 centiseconds */
- if (trk_version >= 30) {
- c = lround(wpt->GetCreationTime().time().msec() / 10.0);
- gbfwrite(&c, 1, 1, mapsend_file_out);
- }
-}
-
-static void
-mapsend_track_write()
-{
- track_disp_all(mapsend_track_hdr, nullptr, mapsend_track_disp);
-}
-
-static void
-mapsend_wpt_write()
-{
- mapsend_hdr hdr = {13, {'4','D','5','3','3','3','3','0',' ','M','S'},
- {'3', '0'}, ms_type_wpt, {0, 0, 0}
- };
- int wpt_count = waypt_count();
-
- if (global_opts.objective == trkdata) {
- mapsend_track_write();
- } else {
- gbfwrite(&hdr, sizeof(hdr), 1, mapsend_file_out);
-
- if (global_opts.objective == wptdata) {
- gbfputint32(wpt_count, mapsend_file_out);
- waypt_disp_all(mapsend_waypt_pr);
- } else if (global_opts.objective == rtedata) {
-
- /* # of points - all routes */
- gbfputint32(route_waypt_count(), mapsend_file_out);
-
- /* write points - all routes */
- route_disp_all(nullptr, nullptr, mapsend_waypt_pr);
- }
-
- int n = route_count();
-
- gbfputint32(n, mapsend_file_out);
-
- if (n) {
- route_disp_all(mapsend_route_hdr, nullptr, mapsend_route_disp);
- }
- }
-}
-
-
-
-ff_vecs_t mapsend_vecs = {
- ff_type_file,
- FF_CAP_RW_ALL,
- mapsend_rd_init,
- mapsend_wr_init,
- mapsend_rd_deinit,
- mapsend_wr_deinit,
- mapsend_read,
- mapsend_wpt_write,
- nullptr,
- &mapsend_args,
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- Access to MapSend files.
-
- Copyright (C) 2002 Robert Lipe, robertlipe@usa.net
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- *
- * Information from:
- * Mapsend File Format Description Revision 1.1, March 6, 2002 from Thales.
- *
- * Note this file format was clearly NOT designed for cross-architecture
- * portability. In fact, because of the pascal nature of the 'string'
- * data type described in that document, it's impractical to describe
- * a 'struct waypoint' in C.
- *
- */
-
-struct mapsend_hdr {
- char ms_length;
- char ms_signature[11];
- char ms_version[2];
- char ms_type;
- char _ms_type[3];
-};
-
-enum ms_type {
- ms_type_rgn = 0,
- ms_type_wpt = 1,
- ms_type_track = 2,
- ms_type_log = 3
-};
<BrowseInformation>false</BrowseInformation>\r
<DebugInformationFormat>None</DebugInformationFormat>\r
<DisableSpecificWarnings>4100;4577;4467;%(DisableSpecificWarnings)</DisableSpecificWarnings>\r
- <ExceptionHandling>Sync</ExceptionHandling>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
<ObjectFileName>release\</ObjectFileName>\r
<Optimization>MaxSpeed</Optimization>\r
<IgnoreImportLibrary>true</IgnoreImportLibrary>\r
<LinkIncremental>false</LinkIncremental>\r
<OutputFile>$(OutDir)\GPSBabel.exe</OutputFile>\r
- <RandomizedBaseAddress>true</RandomizedBaseAddress>\r
<SubSystem>Console</SubSystem>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
</Link>\r
<BrowseInformation>false</BrowseInformation>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<DisableSpecificWarnings>4100;4577;4467;%(DisableSpecificWarnings)</DisableSpecificWarnings>\r
- <ExceptionHandling>Sync</ExceptionHandling>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
<ObjectFileName>debug\</ObjectFileName>\r
<Optimization>Disabled</Optimization>\r
<GenerateDebugInformation>true</GenerateDebugInformation>\r
<IgnoreImportLibrary>true</IgnoreImportLibrary>\r
<OutputFile>$(OutDir)\GPSBabel.exe</OutputFile>\r
- <RandomizedBaseAddress>true</RandomizedBaseAddress>\r
<SubSystem>Console</SubSystem>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
</Link>\r
<ClCompile Include="bushnell_trl.cc" />\r
<ClCompile Include="cet.cc" />\r
<ClCompile Include="cet_util.cc" />\r
- <ClCompile Include="compegps.cc" />\r
<ClCompile Include="zlib\compress.c" />\r
<ClCompile Include="zlib\crc32.c" />\r
- <ClCompile Include="cst.cc" />\r
<ClCompile Include="csv_util.cc" />\r
<ClCompile Include="shapelib\dbfopen.c" />\r
<ClCompile Include="zlib\deflate.c" />\r
<ClCompile Include="fatal.cc" />\r
<ClCompile Include="filter_vecs.cc" />\r
<ClCompile Include="formspec.cc" />\r
- <ClCompile Include="g7towin.cc" />\r
<ClCompile Include="garmin.cc" />\r
<ClCompile Include="garmin_device_xml.cc" />\r
<ClCompile Include="garmin_fit.cc" />\r
<ClCompile Include="glogbook.cc" />\r
<ClCompile Include="gnav_trl.cc" />\r
<ClCompile Include="googledir.cc" />\r
- <ClCompile Include="gopal.cc" />\r
<ClCompile Include="jeeps\gpsapp.cc" />\r
<ClCompile Include="jeeps\gpscom.cc" />\r
<ClCompile Include="jeeps\gpsdevice.cc" />\r
<ClCompile Include="jeeps\gpsusbread.cc" />\r
<ClCompile Include="jeeps\gpsusbsend.cc" />\r
<ClCompile Include="jeeps\gpsusbwin.cc" />\r
- <ClCompile Include="gpsutil.cc" />\r
<ClCompile Include="gpx.cc" />\r
<ClCompile Include="grtcirc.cc" />\r
<ClCompile Include="gtm.cc" />\r
<ClCompile Include="html.cc" />\r
<ClCompile Include="humminbird.cc" />\r
<ClCompile Include="igc.cc" />\r
- <ClCompile Include="ignrando.cc" />\r
<ClCompile Include="igo8.cc" />\r
<ClCompile Include="ik3d.cc" />\r
<ClCompile Include="zlib\infback.c" />\r
<ClCompile Include="internal_styles.cc" />\r
<ClCompile Include="interpolate.cc" />\r
<ClCompile Include="itracku.cc" />\r
- <ClCompile Include="jeeps\jgpsutil.cc" />\r
- <ClCompile Include="jogmap.cc" />\r
- <ClCompile Include="jtr.cc" />\r
<ClCompile Include="kml.cc" />\r
<ClCompile Include="lmx.cc" />\r
<ClCompile Include="lowranceusr.cc" />\r
- <ClCompile Include="maggeo.cc" />\r
<ClCompile Include="magproto.cc" />\r
<ClCompile Include="main.cc" />\r
<ClCompile Include="mapasia.cc" />\r
<ClCompile Include="mapbar_track.cc" />\r
<ClCompile Include="mapfactor.cc" />\r
- <ClCompile Include="mapsend.cc" />\r
<ClCompile Include="mapsource.cc" />\r
<ClCompile Include="mkshort.cc" />\r
<ClCompile Include="mmo.cc" />\r
<ClCompile Include="osm.cc" />\r
<ClCompile Include="ozi.cc" />\r
<ClCompile Include="parse.cc" />\r
- <ClCompile Include="pcx.cc" />\r
- <ClCompile Include="pocketfms_bc.cc" />\r
- <ClCompile Include="pocketfms_fp.cc" />\r
- <ClCompile Include="pocketfms_wp.cc" />\r
<ClCompile Include="polygon.cc" />\r
<ClCompile Include="position.cc" />\r
<ClCompile Include="radius.cc" />\r
- <ClCompile Include="random.cc" />\r
<ClCompile Include="raymarine.cc" />\r
<ClCompile Include="reverse_route.cc" />\r
<ClCompile Include="rgbcolors.cc" />\r
<ClCompile Include="session.cc" />\r
<ClCompile Include="shape.cc" />\r
<ClCompile Include="shapelib\shpopen.c" />\r
- <ClCompile Include="skyforce.cc" />\r
<ClCompile Include="skytraq.cc" />\r
<ClCompile Include="smplrout.cc" />\r
<ClCompile Include="sort.cc" />\r
<ClCompile Include="stackfilter.cc" />\r
- <ClCompile Include="stmsdf.cc" />\r
- <ClCompile Include="stmwpp.cc" />\r
<ClCompile Include="strptime.c" />\r
<ClCompile Include="subrip.cc" />\r
<ClCompile Include="swapdata.cc" />\r
<ClCompile Include="tef_xml.cc" />\r
<ClCompile Include="teletype.cc" />\r
<ClCompile Include="text.cc" />\r
- <ClCompile Include="tiger.cc" />\r
<ClCompile Include="tmpro.cc" />\r
<ClCompile Include="tomtom.cc" />\r
<ClCompile Include="tpg.cc" />\r
<ClCompile Include="validate.cc" />\r
<ClCompile Include="vcf.cc" />\r
<ClCompile Include="vecs.cc" />\r
- <ClCompile Include="vidaone.cc" />\r
- <ClCompile Include="vitosmt.cc" />\r
- <ClCompile Include="vitovtt.cc" />\r
- <ClCompile Include="vpl.cc" />\r
<ClCompile Include="waypt.cc" />\r
<ClCompile Include="wbt-200.cc" />\r
- <ClCompile Include="wfff_xml.cc" />\r
<ClCompile Include="wintec_tes.cc" />\r
<ClCompile Include="xcsv.cc" />\r
<ClCompile Include="xmlgeneric.cc" />\r
<ClCompile Include="src\core\xmlstreamwriter.cc" />\r
<ClCompile Include="xmltag.cc" />\r
<ClCompile Include="xol.cc" />\r
- <ClCompile Include="yahoo.cc" />\r
<ClCompile Include="zlib\zutil.c" />\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="jeeps\gpsserial.h" />\r
<ClInclude Include="jeeps\gpsusbcommon.h" />\r
<ClInclude Include="jeeps\gpsusbint.h" />\r
- <ClInclude Include="jeeps\gpsutil.h" />\r
<ClInclude Include="grtcirc.h" />\r
<ClInclude Include="zlib\gzguts.h" />\r
<ClInclude Include="height.h" />\r
<ClInclude Include="cet\iso_8859_8.h" />\r
<ClInclude Include="src\core\logging.h" />\r
<ClInclude Include="magellan.h" />\r
- <ClInclude Include="mapsend.h" />\r
<ClInclude Include="navilink.h" />\r
<ClInclude Include="nukedata.h" />\r
<ClInclude Include="polygon.h" />\r
<FileType>Document</FileType>\r
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\Qt\5.12.2\msvc2017\mkspecs\features\data\dummy.cpp;%(AdditionalInputs)</AdditionalInputs>\r
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">cl -BxC:\Qt\5.12.2\msvc2017\bin\qmake.exe -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus /MP -wd4100 -Zi -MDd -std:c++14 -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -E C:\Qt\5.12.2\msvc2017\mkspecs\features\data\dummy.cpp 2>NUL >debug\moc_predefs.h</Command>\r
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generate moc_predefs.h</Message>\r
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">debug\moc_predefs.h;%(Outputs)</Outputs>\r
</CustomBuild>\r
<CustomBuild Include="release\moc_predefs.h.cbt">\r
<FileType>Document</FileType>\r
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\Qt\5.12.2\msvc2017\mkspecs\features\data\dummy.cpp;%(AdditionalInputs)</AdditionalInputs>\r
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cl -BxC:\Qt\5.12.2\msvc2017\bin\qmake.exe -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus /MP -wd4100 -O2 -MD -std:c++14 -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -E C:\Qt\5.12.2\msvc2017\mkspecs\features\data\dummy.cpp 2>NUL >release\moc_predefs.h</Command>\r
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Generate moc_predefs.h</Message>\r
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">release\moc_predefs.h;%(Outputs)</Outputs>\r
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
<ClCompile Include="cet_util.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="compegps.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="zlib\compress.c">\r
<ClCompile Include="zlib\crc32.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="cst.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="csv_util.cc">\r
<ClCompile Include="formspec.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="g7towin.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="garmin.cc">\r
<ClCompile Include="googledir.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="gopal.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="jeeps\gpsapp.cc">\r
<ClCompile Include="jeeps\gpsusbwin.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="gpsutil.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="gpx.cc">\r
<ClCompile Include="igc.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="ignrando.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="igo8.cc">\r
<ClCompile Include="itracku.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="jeeps\jgpsutil.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="jogmap.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="jtr.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="kml.cc">\r
<ClCompile Include="lowranceusr.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="maggeo.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="magproto.cc">\r
<ClCompile Include="mapfactor.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="mapsend.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="mapsource.cc">\r
<ClCompile Include="parse.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="pcx.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="pocketfms_bc.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="pocketfms_fp.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="pocketfms_wp.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="polygon.cc">\r
<ClCompile Include="radius.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="random.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="raymarine.cc">\r
<ClCompile Include="shapelib\shpopen.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="skyforce.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="skytraq.cc">\r
<ClCompile Include="stackfilter.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="stmsdf.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="stmwpp.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="strptime.c">\r
<ClCompile Include="text.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="tiger.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="tmpro.cc">\r
<ClCompile Include="vecs.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="vidaone.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="vitosmt.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="vitovtt.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="vpl.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="waypt.cc">\r
<ClCompile Include="wbt-200.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="wfff_xml.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="wintec_tes.cc">\r
<ClCompile Include="xol.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="yahoo.cc">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
<ClCompile Include="zlib\zutil.c">\r
<ClInclude Include="jeeps\gpsusbint.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
- <ClInclude Include="jeeps\gpsutil.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
<ClInclude Include="grtcirc.h">\r
<ClInclude Include="magellan.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
- <ClInclude Include="mapsend.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
<ClInclude Include="navilink.h">\r
+++ /dev/null
-/*
-
- Support for Navigon Mobile Navigator .rte files.
-
- Copyright (C) 2005 Olaf Klein, o.b.klein@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-/*
- line structure, items delimited by '|'
-
--|-|17|-|ZIP-Code|City|ZIP-Code2|Street|No.|-|-|longitude|latitude|-|-| + 0D0A
-
-*/
-
-#include "defs.h"
-#include "cet_util.h"
-#include "csv_util.h"
-#include <cctype>
-#include <cstdarg>
-#include <cstdio>
-#include <cstdlib>
-
-static gbfile* fin, *fout;
-static int curr_rte_num, target_rte_num;
-
-#define MYNAME "navigon"
-
-static char* index_opt;
-
-static
-QVector<arglist_t> nmn4_args = {
- {"index", &index_opt, "Index of route to write (if more than one in source)", nullptr, ARGTYPE_INT, "1", nullptr , nullptr},
-};
-
-
-static void
-nmn4_check_line(char* line)
-{
- char* c = line;
- int i = 0;
- while ((c = strchr(c, '|'))) {
- c++;
- i++;
- }
- is_fatal((i != 15),
- MYNAME ": Invalid or unknown structure!");
-}
-
-static void
-nmn4_read_data()
-{
- char* buff;
- int line = 0;
-
- QString zip2, city, street, number;
-
- auto* route = new route_head;
- route_add_head(route);
-
- while ((buff = gbfgetstr(fin))) {
- if ((line++ == 0) && fin->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
- char* str = buff = lrtrim(buff);
- if (*buff == '\0') {
- continue;
- }
-
- nmn4_check_line(buff);
-
- /* for a quiet compiler */
- QString zip1 = zip2 = city = street = number = QString();
-
- auto* wpt = new Waypoint;
-
- int column = -1;
- QString c = csv_lineparse(str, "|", "", column++);
- while (!c.isNull()) {
- switch (column) {
- case 0: /* "-" */ /* unknown fields for the moment */
- case 1: /* "-" */
- case 2: /* "-" */
- case 3: /* "-" */
- case 9: /* "-" */
- case 10: /* "-" */
- case 13: /* "-" */
- case 14: /* "-" */
- case 15: /* "" */
- break;
-
- case 4: /* ZIP Code */
- if (c[0] != '-') {
- zip1 = c;
- }
- break;
-
- case 5: /* City */
- if (c[0] != '-') {
- city = c;
- }
- break;
-
- case 6: /* ZIP Code -2- */
- if (c[0] != '-') {
- zip2 = c;
- }
- break;
-
- case 7: /* Street */
- if (c[0] != '-') {
- street = c;
- }
- break;
-
- case 8: /* Number */
- if (c[0] != '-') {
- number = c;
- }
-
- /*
- This is our final index
- All stuff for generating names or comments
- is hold locally.
-
- We don't have fields for street, city or zip-code.
- Instead we construct a description from that.
- */
-
- if (zip1 == zip2) {
- zip2 = QString();
- }
- if (!city.isEmpty()) {
- /*
- if any field following city has a value, add a comma to city
- */
- if (!street.isEmpty() || !number.isEmpty() || !zip2.isEmpty()) {
- city += ",";
- }
- }
-
- /* concatenates all fields to one string and release */
- wpt->description = zip1.trimmed() + " " +
- city.trimmed() + " " +
- street.trimmed() + " " +
- number.trimmed() + " " +
- zip2.trimmed();
-
- break;
-
- case 11: /* longitude */
- wpt->longitude = c.toDouble();
- break;
-
- case 12: /* latitude */
- wpt->latitude = c.toDouble();
- break;
-
- }
- c = QString::fromLatin1(csv_lineparse(nullptr, "|", "", column++));
- }
- route_add_wpt(route, wpt);
- }
-}
-
-static void
-nmn4_route_hdr(const route_head*)
-{
- curr_rte_num++;
-}
-
-static void
-nmn4_write_waypt(const Waypoint* wpt)
-{
- char city[128], street[128], zipc[32], number[32];
-
- if (curr_rte_num != target_rte_num) {
- return;
- }
-
- strncpy(city, "-", sizeof(city));
- strncpy(street, "-", sizeof(street));
- strncpy(zipc, "-", sizeof(zipc));
- strncpy(number, "-", sizeof(number));
-
- /*
- Population of specific data used by Navigon may come in the
- future or it may be impossible. We currently output only the
- coordinates in the output, but this is sufficient for Navigon.
-
- The coordinates are the only item we are about guaranteed to have
- when converting to any from any format, so we leave the other
- fields unpopulated. So i have to pay Navigon a compliment for
- implementing a simple data exchange.
- */
-
- gbfprintf(fout, "-|-|-|-|%s|%s|%s|%s|%s|-|-|%.5f|%.5f|-|-|\r\n",
- zipc, city, zipc, street, number,
- wpt->longitude, wpt->latitude);
-}
-
-static void
-nmn4_write_data()
-{
-
- target_rte_num = 1;
-
- if (index_opt != nullptr) {
- target_rte_num = atoi(index_opt);
- is_fatal(((target_rte_num > (int) route_count()) || (target_rte_num < 1)),
- MYNAME ": invalid route number %d (1..%d))!\n", target_rte_num, route_count());
- }
-
- curr_rte_num = 0;
- route_disp_all(nmn4_route_hdr, nullptr, nmn4_write_waypt);
-}
-
-
-/* %%% global callbacks %%% */
-
-static void
-nmn4_rd_init(const QString& fname)
-{
- fin = gbfopen(fname, "rb", MYNAME);
-}
-
-static void
-nmn4_rd_deinit()
-{
- gbfclose(fin);
-}
-
-static void
-nmn4_read()
-{
- nmn4_read_data();
-}
-
-static void
-nmn4_wr_init(const QString& fname)
-{
- fout = gbfopen(fname, "wb", MYNAME);
-}
-
-static void
-nmn4_wr_deinit()
-{
- gbfclose(fout);
-}
-
-static void
-nmn4_write()
-{
- nmn4_write_data();
-}
-
-/* --------------------------------------------------------------------------- */
-
-ff_vecs_t nmn4_vecs = {
- ff_type_file,
- { ff_cap_none, ff_cap_none, (ff_cap)(ff_cap_read | ff_cap_write)},
- nmn4_rd_init,
- nmn4_wr_init,
- nmn4_rd_deinit,
- nmn4_wr_deinit,
- nmn4_read,
- nmn4_write,
- nullptr,
- &nmn4_args,
- CET_CHARSET_MS_ANSI, 1 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- Access to Garmin PCX5 files.
- Format described in: http://www.garmin.com/manuals/PCX5_OwnersManual.pdf
-
- Copyright (C) 2002-2017 Robert Lipe, robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-#include <cmath> // for fabs
-#include <cstdlib> // for atoi
-#include <cstring> // for strstr, strncmp
-
-#include <QChar> // for operator==, QChar
-#include <QDate> // for QDate
-#include <QDateTime> // for QDateTime
-#include <QList> // for QList
-#include <QRegularExpression> // for QRegularExpression
-#include <QString> // for QString, QString::SectionSkipEmpty
-#include <QStringList> // for QStringList
-#include <QTime> // for QTime
-#include <QVector> // for QVector
-#include <Qt> // for CaseInsensitive, UTC
-
-#include "defs.h"
-#include "cet_util.h" // for cet_convert_init
-#include "csv_util.h" // for human_to_dec
-#include "garmin_tables.h" // for gt_find_icon_number_from_desc, PCX, gt_find_desc_from_icon_number
-#include "gbfile.h" // for gbfprintf, gbfclose, gbfopen, gbfgetstr, gbfile
-#include "src/core/datetime.h" // for DateTime
-
-
-static gbfile* file_in, *file_out;
-static short_handle mkshort_handle;
-static short_handle mkshort_handle2; /* for track and route names */
-static char* deficon = nullptr;
-static char* cartoexploreur;
-static int read_as_degrees;
-static int read_gpsu;
-static int route_ctr;
-static int comment_col = 60; /* This has a default */
-static int sym_col;
-static int lat_col;
-static int lon_col;
-
-#define MYNAME "PCX"
-
-static QVector<arglist_t> pcx_args = {{"deficon", &deficon, "Default icon name",
- "Waypoint", ARGTYPE_STRING, ARG_NOMINMAX, nullptr},
- {"cartoexploreur", &cartoexploreur,
- "Write tracks compatible with Carto Exploreur",
- nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr},
- };
-
-static void rd_init(const QString& fname) {
- file_in = gbfopen(fname, "rb", MYNAME);
-}
-
-static void rd_deinit() { gbfclose(file_in); }
-
-static void wr_init(const QString& fname) {
- file_out = gbfopen(fname, "w", MYNAME);
- mkshort_handle = mkshort_new_handle();
- mkshort_handle2 = mkshort_new_handle();
-}
-
-static void wr_deinit() {
- gbfclose(file_out);
- mkshort_del_handle(&mkshort_handle);
- mkshort_del_handle(&mkshort_handle2);
-}
-
-// Find the first token in string |in| when there may be leading whitespace.
-// These files have weird mixtures of spaces and tabs.
-static QString FirstTokenAt(const QString& in, int index) {
- static const QRegularExpression sep(QRegularExpression(R"(\s+)"));
- return in.mid(index, -1).section(sep, 0, 0, QString::SectionSkipEmpty);
-}
-
-// Centralize Date/Time parsing between Waypoint and Trackpoint readers.
-static void SetWaypointTime(Waypoint* wpt, const QString& date, const QString& time) {
- QDate qdate = QDate::fromString(date, "dd-MMM-yy");
- QTime qtime = QTime::fromString(time, "hh:mm:ss");
- if (qdate.isValid() && qtime.isValid()) {
- wpt->SetCreationTime(QDateTime(qdate, qtime, Qt::UTC));
- }
-}
-
-// Loop and parse all the lines of the file. This is complicated by the
-// variety of programs in the wild that loosely use this format and that
-// there are two distinct versions of PCX.
-// In the simplest form, white spaces are disallowed in the individual
-// fields and everything is just whitespace separated and the fields have
-// a fixed order.
-// The presence of an "F" or "H" record changes the precedence of parse
-// to allow fields in any order and length, based on their position in
-// these header lines. Oddly, we've seen only 'W' records take this form.
-
-static void data_read() {
- int symnum;
- Waypoint* wpt_tmp;
- char* buff;
- route_head* track = nullptr;
- route_head* route = nullptr;
- int line_number = 0;
-
- read_as_degrees = 0;
- int points = 0;
- const QRegularExpression sep(QRegularExpression(R"(\s+)"));
-
- // Each line is both |buff| as a C string and |line| as a QString.
- while ((buff = gbfgetstr(file_in))) {
- const QString line = QString(buff).trimmed();
- char* ibuf = lrtrim(buff);
- if ((line_number++ == 0) && file_in->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
-
- switch (ibuf[0]) {
- case 'W': {
- const QStringList tokens = line.split(sep);
- if (tokens.size() < 6) {
- fatal(MYNAME
- ": Unable to parse waypoint, not all required columns "
- "contained\n");
- }
- // tokens[0] = "W".
- QString name = tokens[1];
- QString tbuf = tokens[2];
- QString nbuf = tokens[3];
- QString date = tokens[4];
- QString time = tokens[5];
- long alt = unknown_alt;
- if (tokens.size() == 7) {
- alt = tokens[6].toDouble();
- }
-
- QString desc;
- if (comment_col > 0) {
- desc = line.mid(comment_col, -1);
- }
-
- symnum = 18;
- if (sym_col > 0) {
- symnum = atoi(&ibuf[sym_col]);
- }
-
- // If we have explicit columns for lat and lon,
- // copy those entire words (warning: no spaces)
- // into the respective coord buffers.
- if (lat_col > 0) {
- tbuf = FirstTokenAt(line, lat_col);
- }
- if (lon_col > 0) {
- nbuf = FirstTokenAt(line, lon_col);
- }
-
- wpt_tmp = new Waypoint;
- wpt_tmp->altitude = alt;
- SetWaypointTime(wpt_tmp, date, time);
- wpt_tmp->shortname = name.trimmed();
- wpt_tmp->description = desc.trimmed();
- wpt_tmp->icon_descr = gt_find_desc_from_icon_number(symnum, PCX);
-
- double lat = 0;
- double lon = 0;
- if (read_as_degrees || read_gpsu) {
- human_to_dec(tbuf, &lat, &lon, 1);
- human_to_dec(nbuf, &lat, &lon, 2);
- wpt_tmp->longitude = lon;
- wpt_tmp->latitude = lat;
- } else {
- lat = tbuf.mid(1, -1).toDouble();
- lon = nbuf.mid(1, -1).toDouble();
- if (tbuf[0] == 'S') {
- lat = -lat;
- }
- if (nbuf[0] == 'W') {
- lon = -lon;
- }
- wpt_tmp->longitude = ddmm2degrees(lon);
- wpt_tmp->latitude = ddmm2degrees(lat);
- }
-
- if (route != nullptr) {
- route_add_wpt(route, new Waypoint(*wpt_tmp));
- }
- waypt_add(wpt_tmp);
- points++;
- break;
- }
- case 'H':
- /* Garmap2 has headers
- "H(2 spaces)LATITUDE(some spaces)LONGITUDE(etc... followed by);track
- everything else is
- H(2 chars)TN(trackname\0)
- */
- if (points > 0) {
- track = nullptr;
- points = 0;
- }
- if (track == nullptr) {
- if (ibuf[3] == 'L' && ibuf[4] == 'A') {
- track = new route_head;
- track->rte_name = "track";
- track_add_head(track);
- } else if (ibuf[3] == 'T' && ibuf[4] == 'N') {
- track = new route_head;
- track->rte_name = &ibuf[6];
- track_add_head(track);
- }
- }
- break;
- case 'R':
- route = new route_head;
- route->rte_name = QString(&ibuf[1]).trimmed();
- route_add_head(route);
- break;
- case 'T': {
- const QStringList tokens = line.split(sep);
- if (tokens.size() < 6) {
- fatal(MYNAME
- ": Unable to parse trackpoint, not all required columns "
- "contained\n");
- }
-
- // tokens[0] = "W".
- QString tbuf = tokens[1];
- QString nbuf = tokens[2];
- QString date = tokens[3];
- QString time = tokens[4];
- double alt = tokens[5].toDouble();
-
- wpt_tmp = new Waypoint;
- SetWaypointTime(wpt_tmp, date, time);
-
- double lat, lon;
- if (read_as_degrees) {
- human_to_dec(tbuf, &lat, &lon, 1);
- human_to_dec(nbuf, &lat, &lon, 2);
-
- wpt_tmp->longitude = lon;
- wpt_tmp->latitude = lat;
- } else {
- lat = tbuf.mid(1, -1).toDouble();
- lon = nbuf.mid(1, -1).toDouble();
- if (tbuf[0] == 'S') {
- lat = -lat;
- }
- if (nbuf[0] == 'W') {
- lon = -lon;
- }
- wpt_tmp->longitude = ddmm2degrees(lon);
- wpt_tmp->latitude = ddmm2degrees(lat);
- }
- wpt_tmp->altitude = alt;
-
- /* Did we get a track point before a track header? */
- if (track == nullptr) {
- track = new route_head;
- track->rte_name = "Default";
- track_add_head(track);
- }
- track_add_wpt(track, wpt_tmp);
- points++;
- break;
- }
- case 'U':
- read_as_degrees = !strncmp("LAT LON DEG", ibuf + 3, 11);
- if (strstr(ibuf, "UTM")) {
- fatal(MYNAME ": UTM is not supported.\n");
- }
- break;
- // GPSU is apparently PCX but with a different definition
- // of "LAT LON DM" - unlike the other, it actually IS decimal
- // minutes.
- case 'I':
- read_gpsu = !(strstr(ibuf, "GPSU") == nullptr);
- break;
- // This is a format specifier. Use this line to figure out
- // where our other columns start.
- case 'F': {
- comment_col = line.indexOf("comment", 0, Qt::CaseInsensitive);
- sym_col = line.indexOf("symbol", 0, Qt::CaseInsensitive);
- lat_col = line.indexOf("latitude", 0, Qt::CaseInsensitive);
- lon_col = line.indexOf("longitude", 0, Qt::CaseInsensitive);
- } break;
- default:
- break;
- }
- }
-}
-
-static void gpsutil_disp(const Waypoint* wpt) {
- int icon_token = 0;
-
- double lon = degrees2ddmm(wpt->longitude);
- double lat = degrees2ddmm(wpt->latitude);
-
- QDateTime dt = wpt->GetCreationTime().toUTC();
- const QString ds = dt.toString("dd-MMM-yy hh:mm:ss").toUpper();
-
- if (deficon) {
- icon_token = atoi(deficon);
- } else {
- icon_token = gt_find_icon_number_from_desc(wpt->icon_descr, PCX);
- if (get_cache_icon(wpt)) {
- icon_token = gt_find_icon_number_from_desc(get_cache_icon(wpt), PCX);
- }
- }
-
- gbfprintf(file_out, "W %-6.6s %c%08.5f %c%011.5f %s %5.f %-40.40s %5e %d\n",
- global_opts.synthesize_shortnames
- ? CSTRc(mkshort_from_wpt(mkshort_handle, wpt))
- : CSTRc(wpt->shortname),
- lat < 0.0 ? 'S' : 'N', fabs(lat), lon < 0.0 ? 'W' : 'E', fabs(lon),
- CSTR(ds), (wpt->altitude == unknown_alt) ? -9999 : wpt->altitude,
- (wpt->description != nullptr) ? CSTRc(wpt->description) : "", 0.0,
- icon_token);
-}
-
-static void pcx_track_hdr(const route_head* trk) {
- route_ctr++;
-
- QString default_name = QString::asprintf("Trk%03d", route_ctr);
- QString name =
- mkshort(mkshort_handle2,
- trk->rte_name.isEmpty() ? CSTR(default_name) : trk->rte_name);
- /* Carto Exploreur (popular in France) chokes on trackname headers,
- * so provide option to suppress these.
- */
- if (!cartoexploreur) {
- gbfprintf(file_out, "\n\nH TN %s\n", CSTR(name));
- }
- gbfprintf(file_out,
- "H LATITUDE LONGITUDE DATE TIME ALT ;track\n");
-}
-
-static void pcx_route_hdr(const route_head* rte) {
- route_ctr++;
- QString default_name = QString::asprintf("Rte%03d", route_ctr);
-
- QString name = mkshort(
- mkshort_handle2, rte->rte_name.isEmpty() ? default_name : rte->rte_name);
-
- /* see pcx_track_hdr */
- if (!cartoexploreur) {
- gbfprintf(file_out, "\n\nR %s\n", CSTR(name));
- }
- gbfprintf(file_out,
- "\n"
- "H IDNT LATITUDE LONGITUDE DATE TIME ALT "
- "DESCRIPTION PROXIMITY SYMBOL "
- ";waypts\n");
-}
-
-static void pcx_track_disp(const Waypoint* wpt) {
- double lon = degrees2ddmm(wpt->longitude);
- double lat = degrees2ddmm(wpt->latitude);
-
- QDateTime dt = wpt->GetCreationTime().toUTC();
- const QString ds = dt.toString("dd-MMM-yy hh:mm:ss").toUpper();
-
- gbfprintf(file_out, "T %c%08.5f %c%011.5f %s %.f\n", lat < 0.0 ? 'S' : 'N',
- fabs(lat), lon < 0.0 ? 'W' : 'E', fabs(lon), CSTR(ds),
- wpt->altitude);
-}
-
-static void data_write() {
- gbfprintf(file_out,
- "H SOFTWARE NAME & VERSION\n"
- "I PCX5 2.09\n"
- "\n"
- "H R DATUM IDX DA DF DX "
- " DY DZ\n"
- "M G WGS 84 121 +0.000000e+00 +0.000000e+00 "
- "+0.000000e+00 +0.000000e+00 +0.000000e+00\n"
- "\n"
- "H COORDINATE SYSTEM\n"
- "U LAT LON DM\n");
-
- setshort_length(mkshort_handle, 6);
-
- setshort_length(mkshort_handle2, 20); /* for track and route names */
- setshort_whitespace_ok(mkshort_handle2, 0);
- setshort_mustuniq(mkshort_handle2, 0);
-
- if (global_opts.objective == wptdata) {
- gbfprintf(file_out,
- "\n"
- "H IDNT LATITUDE LONGITUDE DATE TIME ALT "
- "DESCRIPTION PROXIMITY SYMBOL "
- ";waypts\n");
-
- waypt_disp_all(gpsutil_disp);
- } else if (global_opts.objective == trkdata) {
- route_ctr = 0;
- track_disp_all(pcx_track_hdr, nullptr, pcx_track_disp);
- } else if (global_opts.objective == rtedata) {
- route_ctr = 0;
- route_disp_all(pcx_route_hdr, nullptr, gpsutil_disp);
- }
-}
-
-ff_vecs_t pcx_vecs = {
- ff_type_file, FF_CAP_RW_ALL, rd_init, wr_init, rd_deinit,
- wr_deinit, data_read, data_write, nullptr, &pcx_args,
- CET_CHARSET_ASCII, 1 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- Read and write PocketFMS files.
-
- Copyright (C) 2009 Tobias Kretschmar, tobias.kretschmar@gmx.de
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include "defs.h"
-
-#define MYNAME "PocketFMS Breadcrumbs"
-
-static char header_id[] = "BRC";
-
-struct breadcrumb {
- // header
- char id[4]; // 0x42 0x52 0x43 0x00 <=> "BRC"
- uint16_t version; // 0x0100
- uint16_t reserve1; // 0x0000
- // data
- float latitude;
- float longitude;
- float altitude; // meter
- float speed; // m/s
- float course; // degrees
- float magvar; // degrees
- float separation; // meter
- float ehpe; // estimated horizontal position error
- float evpe; // estimated vertical position error
- float espe; // estimated speed position error
- uint16_t fix; // 1..none, 2..2D, 3..3D, 4..dgps, 5pps
- uint16_t year; // 1999..2999
- uint16_t month; // 1..12
- uint16_t day; // 0..31
- uint16_t hour; // 0.23
- uint16_t minute; // 0..59
- uint16_t second; // 0..59
- uint16_t reserve2; // 0x0000
-};
-
-static gbfile* file_in, *file_out;
-
-static void
-rd_init(const QString& fname)
-{
- file_in = gbfopen_le(fname, "rb", MYNAME);
-}
-
-static void
-rd_deinit()
-{
- gbfclose(file_in);
-}
-
-static void
-wr_init(const QString& fname)
-{
- file_out = gbfopen_le(fname, "wb", MYNAME);
-}
-
-static void
-wr_deinit()
-{
- gbfclose(file_out);
-}
-
-static void
-read_tracks()
-{
- breadcrumb bc;
- auto* trk_head = new route_head;
- trk_head->rte_num = 1;
- trk_head->rte_name = "PocketFMS";
- trk_head->rte_desc = "Breadcrumb";
- trk_head->rte_urls.AddUrlLink(UrlLink("www.pocketfms.com"));
- track_add_head(trk_head);
-
- while (1 == gbfread(&bc, sizeof(bc), 1, file_in)) {
- struct tm tm;
-
- if (strcmp(bc.id, header_id) != 0) {
- fatal(MYNAME ": invalid breadcrumb header in input file.\n");
- }
-
- memset(&tm, 0, sizeof(tm));
- tm.tm_year = le_readu16(&bc.year)-1900;
- tm.tm_mon = le_readu16(&bc.month)-1;
- tm.tm_mday = le_readu16(&bc.day);
- tm.tm_hour = le_readu16(&bc.hour);
- tm.tm_min = le_readu16(&bc.minute);
- tm.tm_sec = le_readu16(&bc.second);
-
- auto* wpt = new Waypoint;
- wpt->latitude = le_read_float(&bc.latitude);
- wpt->longitude = le_read_float(&bc.longitude);
- wpt->altitude = FEET_TO_METERS(le_read_float(&bc.altitude));
- wpt->SetCreationTime(mkgmtime(&tm));
- wpt->hdop = le_read_float(&bc.ehpe);
- wpt->vdop = le_read_float(&bc.evpe);
- wpt->pdop = le_read_float(&bc.espe);
- wpt->course = le_read_float(&bc.course);
- wpt->speed = le_read_float(&bc.speed);
- wpt->fix = (fix_type)(le_readu16(&bc.fix) - 1);
-
- track_add_wpt(trk_head, wpt);
- }
-}
-
-static void
-pocketfms_waypt_disp(const Waypoint* wpt)
-{
- breadcrumb bc;
-
- memset(&bc, 0, sizeof(bc));
- const time_t tt = wpt->GetCreationTime().toTime_t();
- struct tm* tm = localtime(&tt);
- if (wpt->creation_time.isValid()) {
- // It seems odd to reread waypoint time here, but this whole format
- // is likely short-lived.
- const time_t tt2 = wpt->GetCreationTime().toTime_t();
- tm = gmtime(&tt2);
- }
-
- strcpy(bc.id, header_id);
- le_write16(&bc.version, 1);
- le_write_float(&bc.latitude, wpt->latitude);
- le_write_float(&bc.longitude, wpt->longitude);
- le_write_float(&bc.altitude, METERS_TO_FEET(wpt->altitude));
- if (tm) {
- le_write16(&bc.year, tm->tm_year + 1900);
- le_write16(&bc.month, tm->tm_mon + 1);
- le_write16(&bc.day, tm->tm_mday);
- le_write16(&bc.hour, tm->tm_hour);
- le_write16(&bc.minute, tm->tm_min);
- le_write16(&bc.second, tm->tm_sec);
- }
- le_write_float(&bc.ehpe, wpt->hdop);
- le_write_float(&bc.evpe, wpt->vdop);
- le_write_float(&bc.espe, wpt->pdop);
- le_write_float(&bc.course, wpt->course);
- le_write_float(&bc.speed, wpt->speed);
- le_write16(&bc.fix, wpt->fix+1);
-
- gbfwrite(&bc, sizeof(bc), 1, file_out);
-}
-
-static void
-data_read()
-{
- read_tracks();
-}
-
-static void
-data_write()
-{
- track_disp_all(nullptr, nullptr, pocketfms_waypt_disp);
-}
-
-ff_vecs_t pocketfms_bc_vecs = {
- ff_type_file,
- {
- ff_cap_none, /* waypoints */
- (ff_cap)(ff_cap_read | ff_cap_write), /* tracks */
- ff_cap_none /* routes */
- },
- rd_init,
- wr_init,
- rd_deinit,
- wr_deinit,
- data_read,
- data_write,
- nullptr,
- nullptr,
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- Read PocketFMS flightplan files.
-
- Copyright (C) 2009 Tobias Kretschmar, tobias.kretschmar@gmx.de
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include <QString> // for QString
-#include <QXmlStreamAttributes> // for QXmlStreamAttributes
-
-#include "defs.h"
-#include "xmlgeneric.h" // for cb_cdata, xg_callback, xg_string, cb_start, cb_end, xg_cb_type, xml_deinit, xml_init, xml_read, xg_tag_mapping
-
-
-static int isFirst = 1;
-static route_head* route = nullptr;
-static Waypoint* wpt_to, *wpt_from;
-static double dest_altitude;
-
-#define MYNAME "PocketFMS FlightPlan"
-
-static xg_callback wpt_s, wpt_from_lat, wpt_from_lon, wpt_from_name, wpt_from_elev;
-static xg_callback wpt_e, wpt_to_lat, wpt_to_lon, wpt_to_name, wpt_to_elev, wpt_altitude;
-
-static xg_tag_mapping gl_map[] = {
- { wpt_s, cb_start, "/PocketFMSFlightplan/LIB" },
- { wpt_from_lat, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Latitude" },
- { wpt_from_lon, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Longitude" },
- { wpt_from_elev, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/Elevation" },
- { wpt_from_name, cb_cdata, "/PocketFMSFlightplan/LIB/FromPoint/FriendlyShortname" },
- { wpt_to_lat, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Latitude" },
- { wpt_to_lon, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Longitude" },
- { wpt_to_name, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/FriendlyShortname" },
- { wpt_to_elev, cb_cdata, "/PocketFMSFlightplan/LIB/ToPoint/Elevation" },
- { wpt_altitude, cb_start, "/PocketFMSFlightplan/LIB/PlannedAltitude" },
- { wpt_e, cb_end, "/PocketFMSFlightplan/LIB" },
- { nullptr, (xg_cb_type)0, nullptr}
-};
-
-static void
-rd_init(const QString& fname)
-{
- xml_init(fname, gl_map, nullptr);
-}
-
-static void
-data_read()
-{
- xml_read();
-}
-
-static void
-rd_deinit()
-{
- if (route != nullptr) {
- Waypoint* head = route->waypoint_list.front();
- Waypoint* tail = route->waypoint_list.back();
- if (head != nullptr) {
- route->rte_name = head->shortname;
- }
- route->rte_name += " - ";
- if (tail != nullptr) {
- route->rte_name += tail->shortname;
- tail->altitude = dest_altitude;
- }
- }
- xml_deinit();
-}
-
-void wpt_s(xg_string, const QXmlStreamAttributes*)
-{
- if (isFirst == 1) {
- wpt_from = new Waypoint;
- route = new route_head;
- route->rte_desc="PocketFMS flightplan";
- route_add_head(route);
- }
- wpt_to = new Waypoint;
-}
-
-void wpt_e(xg_string, const QXmlStreamAttributes*)
-{
- if (isFirst == 1) {
- route_add_wpt(route, wpt_from);
- if (doing_wpts) {
- waypt_add(new Waypoint(*wpt_from));
- }
- wpt_from = nullptr;
- isFirst = 0;
- }
- route_add_wpt(route, wpt_to);
- if (doing_wpts) {
- waypt_add(new Waypoint(*wpt_to));
- }
- wpt_to = nullptr;
-}
-
-void wpt_from_lat(xg_string args, const QXmlStreamAttributes*)
-{
- if (wpt_from != nullptr) {
- wpt_from->latitude = args.toDouble();
- }
-}
-
-void wpt_from_lon(xg_string args, const QXmlStreamAttributes*)
-{
- if (wpt_from != nullptr) {
- wpt_from->longitude = args.toDouble();
- }
-}
-
-void wpt_from_name(xg_string args, const QXmlStreamAttributes*)
-{
- if (wpt_from != nullptr) {
- wpt_from->shortname += args;
- }
-}
-
-void wpt_from_elev(xg_string args, const QXmlStreamAttributes*)
-{
- if (wpt_from != nullptr) {
- wpt_from->altitude = FEET_TO_METERS(args.toDouble());
- }
-}
-
-void wpt_to_lat(xg_string args, const QXmlStreamAttributes*)
-{
- wpt_to->latitude = args.toDouble();
-}
-
-void wpt_to_lon(xg_string args, const QXmlStreamAttributes*)
-{
- wpt_to->longitude = args.toDouble();
-}
-
-void wpt_to_name(xg_string args, const QXmlStreamAttributes*)
-{
- wpt_to->shortname += args;
-}
-
-void wpt_to_elev(xg_string args, const QXmlStreamAttributes*)
-{
- dest_altitude = FEET_TO_METERS(args.toDouble());
-}
-
-void wpt_altitude(xg_string, const QXmlStreamAttributes* attrv)
-{
- int isFeet = 0;
-
- if (attrv->hasAttribute("Value")) {
- wpt_to->altitude = attrv->value("Value").toString().toDouble();
- }
- if (attrv->hasAttribute("Unit")) {
- isFeet = (attrv->value("Unit") == u"ft");
- }
- if (isFeet) {
- wpt_to->altitude = FEET_TO_METERS(wpt_to->altitude);
- }
-}
-
-ff_vecs_t pocketfms_fp_vecs = {
- ff_type_file,
- {
- ff_cap_read /* waypoints */,
- ff_cap_none /* tracks */,
- ff_cap_read /* routes */
- },
- rd_init,
- nullptr,
- rd_deinit,
- nullptr,
- data_read,
- nullptr,
- nullptr,
- nullptr,
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- PocketFMS waypoint text files (wpt).
-
- Copyright (C) 2009 Tobias Kretschmar, tobias.kretschmar@gmx.de
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "defs.h"
-#include "csv_util.h"
-#include <cstdio>
-#include <cstdlib>
-
-#define MYNAME "PocketFMS waypoint text file format"
-
-static gbfile* file_in, *file_out;
-
-static void
-rd_init(const QString& fname)
-{
- file_in = gbfopen_le(fname, "r", MYNAME);
-}
-
-static double wppos_to_dec(char* value)
-{
- if (strstr(value, "\xB0") == nullptr) {
- return atof(value);
- } else {
- int degrees, minutes;
- float seconds;
- int sign = 1;
-
- if (toupper(value[0]) == 'N' || toupper(value[0]) == 'E' || value[0] == '+') {
- value = &value[1];
- } else if (toupper(value[0]) == 'S' || toupper(value[0]) == 'W' || value[0] == '-') {
- value = &value[1];
- sign = -1;
- }
-
- sscanf(value, "%d\xB0%d'%f\"", °rees, &minutes, &seconds);
- return sign * (degrees + ((float)minutes / 60) + (seconds / 3600));
- }
-}
-
-static void
-data_read()
-{
- char* buff;
- int linecount = 0;
- while ((buff = gbfgetstr(file_in))) {
- rtrim(buff);
- if (strlen(buff) == 0) {
- break;
- }
- linecount++;
- auto* wpt = new Waypoint;
- char* s = buff;
- s = csv_lineparse(s, "\\w", "", linecount);
- if (!s) {
- fatal(MYNAME "Invalid name");
- }
- wpt->shortname = s;
- s = csv_lineparse(nullptr, "\\w", "", linecount);
- if (!s) {
- fatal(MYNAME "Invalid latitude %s", qPrintable(wpt->shortname));
- }
- wpt->latitude = wppos_to_dec(s);
-
- s = csv_lineparse(nullptr, "\\w", "", linecount);
- if (!s) {
- fatal(MYNAME "Invalid longitude %s", qPrintable(wpt->shortname));
- }
- wpt->longitude = wppos_to_dec(s);
- waypt_add(wpt);
-
- // continue reading until csv_lineparse returns null indicating all dynamic memory has been deallocated.
- while (csv_lineparse(nullptr, "\\w", "", linecount));
- }
-}
-
-static void
-rd_deinit()
-{
- gbfclose(file_in);
-}
-
-static void
-wr_init(const QString& fname)
-{
- file_out = gbfopen_le(fname, "w", MYNAME);
-}
-
-static void
-enigma_waypt_disp(const Waypoint* wpt)
-{
- if (!wpt->shortname.isEmpty()) {
- // The output might have a space or control character.
- int l = wpt->shortname.length();
- char *t = (char*) xmalloc(l + 1);
- char* d = t;
- for (int i = 0; i < l; i++) {
- char s = wpt->shortname[i].cell();
- if (isgraph(s)) {
- *d++ = s;
- }
- }
- *d = 0;
- gbfprintf(file_out, "%s %f %f\n", t, wpt->latitude, wpt->longitude);
- xfree(t);
- } else {
- gbfprintf(file_out, "%s %f %f\n", "NONAME", wpt->latitude, wpt->longitude);
- }
-}
-
-static void
-data_write()
-{
- waypt_disp_all(enigma_waypt_disp);
-}
-
-static void
-wr_deinit()
-{
- gbfclose(file_out);
-}
-
-ff_vecs_t pocketfms_wp_vecs = {
- ff_type_file,
- {
- (ff_cap)(ff_cap_read | ff_cap_write), /* waypoints */
- ff_cap_none, /* tracks */
- ff_cap_none, /* routes */
- },
- rd_init,
- wr_init,
- rd_deinit,
- wr_deinit,
- data_read,
- data_write,
- nullptr,
- nullptr,
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="45.988538473" minlon="11.609659845" maxlat="46.159847646" maxlon="12.121156748"/>
- <wpt lat="46.029489931" lon="11.825879086">
- <ele>1400.000</ele>
- <name>F01140</name>
- <cmt>DECOLLO MONTE AVENA</cmt>
- <desc>DECOLLO MONTE AVENA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.008626612" lon="11.860931698">
- <ele>300.000</ele>
- <name>F02030</name>
- <cmt>AVIOSUPERFICE FELTRE</cmt>
- <desc>AVIOSUPERFICE FELTRE</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.021150004" lon="11.885480080">
- <ele>230.000</ele>
- <name>F03023</name>
- <cmt>ATTERRAGGIO VALENTINE</cmt>
- <desc>ATTERRAGGIO VALENTINE</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.033586576" lon="11.882367229">
- <ele>320.000</ele>
- <name>F04032</name>
- <cmt>ATTERRAG. BIRRERIA PEDAVENA</cmt>
- <desc>ATTERRAG. BIRRERIA PEDAVENA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.159847646" lon="12.083258100">
- <ele>420.000</ele>
- <name>F06042</name>
- <cmt>DIGA DEL MIS</cmt>
- <desc>DIGA DEL MIS</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.144176666" lon="12.075475551">
- <ele>460.000</ele>
- <name>F07046</name>
- <cmt>SOSPIROLO CHIESA</cmt>
- <desc>SOSPIROLO CHIESA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.081281529" lon="11.985699010">
- <ele>450.000</ele>
- <name>F08045</name>
- <cmt>CESIOMAGGIORE FABBRICA</cmt>
- <desc>CESIOMAGGIORE FABBRICA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.075557491" lon="12.033310749">
- <ele>290.000</ele>
- <name>F09029</name>
- <cmt>CARTIERA SGIUSTINA</cmt>
- <desc>CARTIERA SGIUSTINA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="45.988538473" lon="11.845020688">
- <ele>380.000</ele>
- <name>F10038</name>
- <cmt>SEREN DEL GRAPPA CHIESA</cmt>
- <desc>SEREN DEL GRAPPA CHIESA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.010513118" lon="11.830375818">
- <ele>346.900</ele>
- <name>F11031</name>
- <cmt>ARTEN FELTRE</cmt>
- <desc>ARTEN FELTRE</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.047897102" lon="11.873818128">
- <ele>450.000</ele>
- <name>F12045</name>
- <cmt>NORCEN CAMPI DA TENNIS</cmt>
- <desc>NORCEN CAMPI DA TENNIS</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.152906683" lon="12.121156748">
- <ele>380.000</ele>
- <name>F13038</name>
- <cmt>SOSPIROLO CAVA</cmt>
- <desc>SOSPIROLO CAVA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.042745832" lon="11.852392523">
- <ele>1010.000</ele>
- <name>F14101</name>
- <cmt>COL MELON RIF BELVEDERE</cmt>
- <desc>COL MELON RIF BELVEDERE</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.010879760" lon="11.813717946">
- <ele>310.000</ele>
- <name>F15031</name>
- <cmt>FONZASO SPORTFUL</cmt>
- <desc>FONZASO SPORTFUL</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.040623535" lon="11.984049113">
- <ele>252.300</ele>
- <name>F16025</name>
- <cmt>BUSCHE LATTERIA</cmt>
- <desc>BUSCHE LATTERIA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.046930843" lon="11.748528051">
- <ele>605.000</ele>
- <name>F17063</name>
- <cmt>LAMON</cmt>
- <desc>LAMON</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="45.991673928" lon="11.746357624">
- <ele>509.400</ele>
- <name>F18051</name>
- <cmt>ARSIE'</cmt>
- <desc>ARSIE'</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.018978905" lon="11.911089765">
- <ele>271.200</ele>
- <name>F19027</name>
- <cmt>CASTELLO DI FELTRE</cmt>
- <desc>CASTELLO DI FELTRE</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.011490645" lon="11.833422633">
- <ele>300.000</ele>
- <name>F20030</name>
- <cmt>SANTA LUCIA CHIESETTA</cmt>
- <desc>SANTA LUCIA CHIESETTA</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.039976504" lon="11.825483515">
- <ele>1430.000</ele>
- <name>F21143</name>
- <cmt>MALGA CAMPON</cmt>
- <desc>MALGA CAMPON</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.050825348" lon="12.061925180">
- <ele>300.000</ele>
- <name>F22030</name>
- <cmt>ZANUSSI MEL</cmt>
- <desc>ZANUSSI MEL</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.022014968" lon="11.907799546">
- <ele>270.000</ele>
- <name>F23027</name>
- <cmt>FELTRE OSPEDALE</cmt>
- <desc>FELTRE OSPEDALE</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.063284117" lon="11.609659845">
- <ele>860.000</ele>
- <name>F24086</name>
- <cmt>BAILO CASTEL TESINO</cmt>
- <desc>BAILO CASTEL TESINO</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="46.057193356" lon="11.888858143">
- <ele>450.000</ele>
- <name>F25045</name>
- <cmt>CASA SCEICCO</cmt>
- <desc>CASA SCEICCO</desc>
- <sym>Waypoint</sym>
- </wpt>
-</gpx>
+++ /dev/null
-G WGS 84
-U 1
-W F01140 A 46.0294899313ºN 11.8258790855ºE 27-MAR-62 00:00:00 1400.000000 DECOLLO MONTE AVENA
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F02030 A 46.0086266116ºN 11.8609316981ºE 27-MAR-62 00:00:00 300.000000 AVIOSUPERFICE FELTRE
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F03023 A 46.0211500041ºN 11.8854800796ºE 27-MAR-62 00:00:00 230.000000 ATTERRAGGIO VALENTINE
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F04032 A 46.0335865765ºN 11.8823672293ºE 27-MAR-62 00:00:00 320.000000 ATTERRAG. BIRRERIA PEDAVENA
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F06042 A 46.1598476455ºN 12.0832581003ºE 27-MAR-62 00:00:00 420.000000 DIGA DEL MIS
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F07046 A 46.1441766659ºN 12.0754755514ºE 27-MAR-62 00:00:00 460.000000 SOSPIROLO CHIESA
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F08045 A 46.0812815292ºN 11.9856990105ºE 27-MAR-62 00:00:00 450.000000 CESIOMAGGIORE FABBRICA
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F09029 A 46.0755574914ºN 12.0333107491ºE 27-MAR-62 00:00:00 290.000000 CARTIERA SGIUSTINA
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F10038 A 45.9885384730ºN 11.8450206880ºE 27-MAR-62 00:00:00 380.000000 SEREN DEL GRAPPA CHIESA
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F11031 A 46.0105131183ºN 11.8303758183ºE 27-MAR-62 00:00:00 346.900000 ARTEN FELTRE
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F12045 A 46.0478971020ºN 11.8738181282ºE 27-MAR-62 00:00:00 450.000000 NORCEN CAMPI DA TENNIS
-w Waypoint,0,0.0,16777215,255,1,7,,10.0
-W F13038 A 46.1529066825ºN 12.1211567478ºE 27-MAR-62 00:00:00 380.000000 SOSPIROLO CAVA
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F14101 A 46.0427458323ºN 11.8523925232ºE 27-MAR-62 00:00:00 1010.000000 COL MELON RIF BELVEDERE
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F15031 A 46.0108797603ºN 11.8137179459ºE 27-MAR-62 00:00:00 310.000000 FONZASO SPORTFUL
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F16025 A 46.0406235353ºN 11.9840491129ºE 27-MAR-62 00:00:00 252.300000 BUSCHE LATTERIA
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F17063 A 46.0469308434ºN 11.7485280506ºE 27-MAR-62 00:00:00 605.000000 LAMON
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F18051 A 45.9916739281ºN 11.7463576240ºE 27-MAR-62 00:00:00 509.400000 ARSIE'
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F19027 A 46.0189789055ºN 11.9110897654ºE 27-MAR-62 00:00:00 271.200000 CASTELLO DI FELTRE
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F20030 A 46.0114906453ºN 11.8334226329ºE 27-MAR-62 00:00:00 300.000000 SANTA LUCIA CHIESETTA
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F21143 A 46.0399765040ºN 11.8254835151ºE 27-MAR-62 00:00:00 1430.000000 MALGA CAMPON
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F22030 A 46.0508253483ºN 12.0619251800ºE 27-MAR-62 00:00:00 300.000000 ZANUSSI MEL
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F23027 A 46.0220149684ºN 11.9077995458ºE 27-MAR-62 00:00:00 270.000000 FELTRE OSPEDALE
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F24086 A 46.0632841167ºN 11.6096598449ºE 27-MAR-62 00:00:00 860.000000 BAILO CASTEL TESINO
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-W F25045 A 46.0571933560ºN 11.8888581427ºE 27-MAR-62 00:00:00 450.000000 CASA SCEICCO
-w Waypoint,0,0.0,16777215,255,1,7,,0.0
-
-
+++ /dev/null
-
-W wpt001 A 41.80711816ºN 2.34416887ºE 16-MAY-2010 09:30:03 0.000000
-
-w Waypoint,0,-1.0,16317688,248,1,39,,0.0,0,-1,0
-
-W wpt002 A 41.80695656ºN 2.34409159ºE 16-MAY-2010 09:35:49 1099.570068
-
-w Waypoint,0,-1.0,16317688,248,1,39,,0.0,0,-1,0
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="41.806956560" minlon="2.344091590" maxlat="41.807118160" maxlon="2.344168870"/>
- <wpt lat="41.807118160" lon="2.344168870">
- <ele>0.000</ele>
- <time>2010-05-16T09:30:03Z</time>
- <name>wpt001</name>
- <cmt>wpt001</cmt>
- <desc>wpt001</desc>
- <sym>Waypoint</sym>
- </wpt>
- <wpt lat="41.806956560" lon="2.344091590">
- <ele>1099.570</ele>
- <time>2010-05-16T09:35:49Z</time>
- <name>wpt002</name>
- <cmt>wpt002</cmt>
- <desc>wpt002</desc>
- <sym>Waypoint</sym>
- </wpt>
-</gpx>
+++ /dev/null
-Grid Lat/Lon hddd°mm.mmm'\r
-Datum WGS 84\r
-\r
-Header Name Description Type Position Altitude Depth Proximity Temperature Display Mode Color Symbol Facility City State Country Date Modified Link Categories\r
-\r
-Waypoint 5058ROAD ROAD CROSSING User Waypoint N42 26.400 W71 07.255 54 m Symbol & Name Unknown Waypoint 02/06/2001 00:18:14 \r
-Waypoint 5066 User Waypoint N42 26.333 W71 07.157 45 m Symbol & Name Unknown Crossing 28/11/2001 21:05:28 \r
-Waypoint 5067 User Waypoint N42 26.354 W71 07.181 58 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:55 \r
-Waypoint 5096 User Waypoint N42 26.335 W71 06.969 45 m Symbol & Name Unknown Waypoint 16/11/2001 23:03:38 \r
-Waypoint 5142 User Waypoint N42 26.634 W71 07.323 51 m Symbol & Name Unknown Waypoint 28/11/2001 21:05:28 \r
-Waypoint 5144SUMMIT User Waypoint N42 26.722 W71 07.371 62 m Symbol & Name Unknown Summit 28/11/2001 21:05:28 \r
-Waypoint 5148NANEPA User Waypoint N42 26.986 W71 07.339 120 m Symbol & Name Unknown Waypoint 07/11/2001 23:53:41 \r
-Waypoint 5150TANK WATER TANK User Waypoint N42 26.504 W71 07.301 67 m Symbol & Name Unknown Museum 02/06/2001 00:18:16 \r
-Waypoint 5156 User Waypoint N42 26.838 W71 07.287 128 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:58 \r
-Waypoint 5179DEAD Dead End User Waypoint N42 26.992 W71 07.158 117 m Symbol & Name Unknown Danger Area 02/06/2001 03:26:59 \r
-Waypoint 5224 User Waypoint N42 27.292 W71 07.506 97 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:59 \r
-Waypoint 5229 User Waypoint N42 27.545 W71 07.499 83 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:59 \r
-Waypoint 5236BRIDGE Bridge User Waypoint N42 27.388 W71 07.479 90 m Symbol & Name Unknown Bridge 02/06/2001 03:26:59 \r
-Waypoint 5237 User Waypoint N42 27.419 W71 07.468 83 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:59 \r
-Waypoint 5239ROAD Road User Waypoint N42 27.557 W71 07.474 81 m Symbol & Name Unknown Truck Stop 02/06/2001 03:27:00 \r
-Waypoint 5252PURPLE User Waypoint N42 27.195 W71 07.273 78 m Symbol & Name Unknown Summit 07/11/2001 23:53:41 \r
-Waypoint 5254 User Waypoint N42 27.264 W71 07.259 67 m Symbol & Name Unknown Waypoint 28/11/2001 21:05:28 \r
-Waypoint 5258 User Waypoint N42 27.087 W71 07.305 75 m Symbol & Name Unknown Waypoint 07/11/2001 23:53:41 \r
-Waypoint 5264 User Waypoint N42 27.264 W71 07.240 65 m Symbol & Name Unknown Waypoint 28/11/2001 21:05:28 \r
-Waypoint 526708 User Waypoint N42 27.466 W71 07.263 77 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:00 \r
-Waypoint 526750 User Waypoint N42 27.425 W71 07.219 75 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:00 \r
-Waypoint 5267OBSTAC User Waypoint N42 27.443 W71 07.191 74 m Symbol & Name Unknown Amusement Park 02/06/2001 03:27:00 \r
-Waypoint 527614 User Waypoint N42 27.396 W71 07.181 79 m Symbol & Name Unknown Waypoint 07/11/2001 23:53:41 \r
-Waypoint 527631 User Waypoint N42 27.375 W71 07.161 79 m Symbol & Name Unknown Waypoint 07/11/2001 23:53:41 \r
-Waypoint 5278 User Waypoint N42 27.489 W71 07.148 68 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:00 \r
-Waypoint 5278ROAD Road User Waypoint N42 27.527 W71 07.139 67 m Symbol & Name Unknown Truck Stop 02/06/2001 03:27:01 \r
-Waypoint 5287WATER Reservoir User Waypoint N42 27.464 W71 07.049 68 m Symbol & Name Unknown Swimming Area 02/06/2001 03:27:01 \r
-Waypoint 5289 User Waypoint N42 27.563 W71 07.062 64 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:01 \r
-Waypoint 5299DEAD Dead End User Waypoint N42 27.578 W71 06.991 69 m Symbol & Name Unknown Danger Area 02/06/2001 03:27:01 \r
-Waypoint 5374FIRE User Waypoint N42 27.851 W71 07.190 53 m Symbol & Name Unknown Waypoint 28/11/2001 21:05:28 \r
-Waypoint 5376 User Waypoint N42 27.939 W71 07.164 56 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:02 \r
-Waypoint 5376BRIDGE Bridge User Waypoint N42 27.946 W71 07.189 55 m Symbol & Name Unknown Bridge 02/06/2001 03:27:01 \r
-Waypoint 5376DEAD Dead End User Waypoint N42 27.929 W71 07.149 57 m Symbol & Name Unknown Danger Area 02/06/2001 03:27:02 \r
-Waypoint 5376STREAM User Waypoint N42 27.955 W71 07.160 65 m Symbol & Name Unknown Bridge 07/11/2001 23:53:41 \r
-Waypoint 6006 User Waypoint N42 26.341 W71 06.867 56 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:55 \r
-Waypoint 6006BLUE User Waypoint N42 26.316 W71 06.888 46 m Symbol & Name Unknown Waypoint 28/11/2001 21:05:28 \r
-Waypoint 6014MEADOW User Waypoint N42 26.205 W71 06.793 38 m Symbol & Name Unknown Waypoint 28/11/2001 21:05:28 \r
-Waypoint 6016 Bike Loop Connector User Waypoint N42 26.320 W71 06.845 43 m Symbol & Name Unknown Waypoint 28/11/2001 21:05:28 \r
-Waypoint 6029 User Waypoint N42 26.505 W71 06.793 56 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:55 \r
-Waypoint 6042CROSS Crossing User Waypoint N42 26.128 W71 06.580 45 m Symbol & Name Unknown Crossing 02/06/2001 03:27:05 \r
-Waypoint 6053 User Waypoint N42 26.175 W71 06.545 50 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:05 \r
-Waypoint 6066 User Waypoint N42 26.355 W71 06.450 26 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:57 \r
-Waypoint 6067 User Waypoint N42 26.386 W71 06.455 34 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:57 \r
-Waypoint 6071 User Waypoint N42 26.086 W71 06.352 30 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:57 \r
-Waypoint 6073 User Waypoint N42 25.998 W71 06.396 15 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:56 \r
-Waypoint 6077LOGS Log Crossing User Waypoint N42 26.370 W71 06.393 32 m Symbol & Name Unknown Amusement Park 02/06/2001 00:18:16 \r
-Waypoint 6084 User Waypoint N42 26.240 W71 06.286 38 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:57 \r
-Waypoint 6121DEAD Dead End User Waypoint N42 26.587 W71 06.760 56 m Symbol & Name Unknown Danger Area 02/06/2001 03:26:57 \r
-Waypoint 6130 User Waypoint N42 26.532 W71 06.658 64 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:55 \r
-Waypoint 6131 User Waypoint N42 26.579 W71 06.686 64 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:58 \r
-Waypoint 6153 User Waypoint N42 26.686 W71 06.533 63 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:05 \r
-Waypoint 6155DEAD Dead End User Waypoint N42 26.808 W71 06.527 61 m Symbol & Name Unknown Danger Area 02/06/2001 03:27:04 \r
-Waypoint 6171 User Waypoint N42 26.616 W71 06.378 55 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:05 \r
-Waypoint 6176 User Waypoint N42 26.868 W71 06.397 62 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:04 \r
-Waypoint 6177 User Waypoint N42 26.907 W71 06.369 62 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:04 \r
-Waypoint 6181CROSS Crossing User Waypoint N42 26.580 W71 06.353 53 m Symbol & Name Unknown Crossing 02/06/2001 03:27:05 \r
-Waypoint 6272 User Waypoint N42 27.205 W71 06.407 70 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:55 \r
-Waypoint 6278 User Waypoint N42 27.498 W71 06.406 70 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:04 \r
-Waypoint 6280 User Waypoint N42 27.086 W71 06.325 58 m Symbol & Name Unknown Waypoint 16/11/2001 23:03:38 \r
-Waypoint 6283 User Waypoint N42 27.231 W71 06.312 67 m Symbol & Name Unknown Waypoint 16/11/2001 23:03:38 \r
-Waypoint 6289 User Waypoint N42 27.599 W71 06.370 73 m Symbol & Name Unknown Waypoint 16/11/2001 23:03:38 \r
-Waypoint 6297 User Waypoint N42 27.457 W71 06.307 73 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:04 \r
-Waypoint 6328 User Waypoint N42 28.027 W71 06.814 54 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:02 \r
-Waypoint 6353DEAD Dead End User Waypoint N42 27.767 W71 06.599 47 m Symbol & Name Unknown Danger Area 02/06/2001 03:27:03 \r
-Waypoint 6354 User Waypoint N42 27.852 W71 06.592 44 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:03 \r
-Waypoint 635722 User Waypoint N42 27.988 W71 06.604 49 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:02 \r
-Waypoint 635783 User Waypoint N42 27.993 W71 06.565 49 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:02 \r
-Waypoint 6373 User Waypoint N42 27.810 W71 06.427 62 m Symbol & Name Unknown Waypoint 02/06/2001 03:27:03 \r
-Waypoint 6634 User Waypoint N42 24.063 W71 06.614 4 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:56 \r
-Waypoint 6979 User Waypoint N42 25.957 W71 06.392 13 m Symbol & Name Unknown Waypoint 02/06/2001 03:26:56 \r
-Waypoint 6997 User Waypoint N42 25.862 W71 06.473 34 m Symbol & Name Unknown Waypoint 16/11/2001 23:03:38 \r
-Waypoint BEAR HILL BEAR HILL TOWER User Waypoint N42 27.941 W71 06.442 88 m Symbol & Name Unknown Tall Tower 02/06/2001 03:27:03 \r
-Waypoint BELLEVUE User Waypoint N42 25.857 W71 06.458 23 m Symbol & Name Unknown Parking Area 02/06/2001 00:18:15 \r
-Waypoint DARKHOLLPO Dark Hollow Pond User Waypoint N42 27.511 W71 06.219 Symbol & Name Unknown Fishing Area 16/07/2005 20:53:40 \r
-Waypoint GATE14 Gate 14 User Waypoint N42 27.072 W71 07.596 111 m Symbol & Name Unknown Truck Stop 02/06/2001 03:26:59 \r
-Waypoint GATE16 Gate 16 User Waypoint N42 27.510 W71 07.325 78 m Symbol & Name Unknown Truck Stop 02/06/2001 03:27:00 \r
-Waypoint GATE17 Gate 17 User Waypoint N42 27.563 W71 07.154 66 m Symbol & Name Unknown Truck Stop 02/06/2001 03:27:01 \r
-Waypoint GATE19 Gate 19 User Waypoint N42 27.981 W71 07.154 57 m Symbol & Name Unknown Truck Stop 02/06/2001 03:27:02 \r
-Waypoint GATE21 Gate 21 User Waypoint N42 28.119 W71 06.462 49 m Symbol & Name Unknown Truck Stop 02/06/2001 03:27:03 \r
-Waypoint GATE24 Gate 24 User Waypoint N42 27.403 W71 06.178 81 m Symbol & Name Unknown Truck Stop 02/06/2001 03:27:03 \r
-Waypoint GATE5 Gate 5 User Waypoint N42 25.851 W71 06.461 22 m Symbol & Name Unknown Truck Stop 28/11/2001 21:05:28 \r
-Waypoint GATE6 User Waypoint N42 25.874 W71 06.554 27 m Symbol & Name Unknown Waypoint 07/11/2001 23:53:41 \r
-Waypoint PANTHRCAVE User Waypoint N42 26.099 W71 06.597 45 m Symbol & Name Unknown Tunnel 07/11/2001 23:53:41 \r
-Waypoint SHEEPFOLD Sheepfold Parking Lot User Waypoint N42 27.205 W71 06.407 70 m Symbol & Name Unknown Parking Area 02/06/2001 00:18:13 \r
-Waypoint SOAPBOX Soap Box Derby Track User Waypoint N42 27.357 W71 06.449 64 m Symbol & Name Unknown Cemetery 02/06/2001 03:27:04 \r
-\r
-\r
-Header Name Length Course Waypoints Link\r
-\r
-Route BELLEVUE 11.2 km 0° true 46 waypoints \r
-\r
-Header Waypoint Name Distance Leg Length Course\r
-\r
-Route Waypoint BELLEVUE 0 m\r
-Route Waypoint GATE6 136 m 136 m 284° true\r
-Route Waypoint PANTHRCAVE 556 m 420 m 352° true\r
-Route Waypoint 6014MEADOW 891 m 334 m 306° true\r
-Route Waypoint 6006 1.2 km 271 m 338° true\r
-Route Waypoint 6006BLUE 1.2 km 55 m 211° true\r
-Route Waypoint 5096 1.3 km 116 m 288° true\r
-Route Waypoint 5066 1.6 km 257 m 269° true\r
-Route Waypoint 5067 1.6 km 52 m 319° true\r
-Route Waypoint 5058ROAD 1.8 km 133 m 310° true\r
-Route Waypoint 5150TANK 2.0 km 203 m 342° true\r
-Route Waypoint 5142 2.2 km 244 m 353° true\r
-Route Waypoint 5144SUMMIT 2.4 km 175 m 338° true\r
-Route Waypoint 5156 2.6 km 245 m 28° true\r
-Route Waypoint 5148NANEPA 2.9 km 284 m 345° true\r
-Route Waypoint 5258 3.1 km 193 m 14° true\r
-Route Waypoint 5252PURPLE 3.3 km 207 m 12° true\r
-Route Waypoint 527631 3.7 km 367 m 25° true\r
-Route Waypoint 527614 3.7 km 46 m 325° true\r
-Route Waypoint 5267OBSTAC 3.8 km 90 m 351° true\r
-Route Waypoint 5278 3.9 km 103 m 35° true\r
-Route Waypoint 5289 4.1 km 181 m 41° true\r
-Route Waypoint 5374FIRE 4.7 km 563 m 342° true\r
-Route Waypoint 5376 4.8 km 167 m 12° true\r
-Route Waypoint 5376STREAM 4.9 km 30 m 11° true\r
-Route Waypoint 6328 5.4 km 491 m 74° true\r
-Route Waypoint 635722 5.7 km 297 m 104° true\r
-Route Waypoint 635783 5.7 km 55 m 79° true\r
-Route Waypoint 6373 6.1 km 389 m 151° true\r
-Route Waypoint BEAR HILL 6.3 km 245 m 355° true\r
-Route Waypoint 6289 7.0 km 642 m 171° true\r
-Route Waypoint 6297 7.3 km 278 m 162° true\r
-Route Waypoint 6283 7.7 km 420 m 181° true\r
-Route Waypoint 6280 8.0 km 269 m 184° true\r
-Route Waypoint 6177 8.3 km 338 m 190° true\r
-Route Waypoint 6176 8.4 km 81 m 208° true\r
-Route Waypoint 6153 8.8 km 385 m 209° true\r
-Route Waypoint 6171 9.0 km 249 m 122° true\r
-Route Waypoint 6131 9.4 km 428 m 261° true\r
-Route Waypoint 6130 9.5 km 95 m 156° true\r
-Route Waypoint 6029 9.7 km 191 m 255° true\r
-Route Waypoint 6006 10.0 km 321 m 198° true\r
-Route Waypoint 6014MEADOW 10.3 km 271 m 158° true\r
-Route Waypoint PANTHRCAVE 10.6 km 334 m 126° true\r
-Route Waypoint GATE6 11.1 km 420 m 172° true\r
-Route Waypoint BELLEVUE 11.2 km 136 m 104° true\r
-\r
-\r
-Header Name Start Time Elapsed Time Length Average Speed Link\r
-\r
-Track - Trk from .gpx file 25/05/2002 17:06:21 1:59:36 7.7 km 4 kph \r
-\r
-Header Position Time Altitude Depth Temperature Leg Length Leg Time Leg Speed Leg Course\r
-\r
-Trackpoint N30 03.731 W91 36.621 25/05/2002 17:06:21 1 m \r
-Trackpoint N30 03.767 W91 36.634 25/05/2002 17:09:55 70 m 0:03:34 1.2 kph 343° true\r
-Trackpoint N30 03.762 W91 36.496 25/05/2002 17:12:00 222 m 0:02:05 6 kph 92° true\r
-Trackpoint N30 03.740 W91 36.443 25/05/2002 17:12:48 94 m 0:00:48 7 kph 116° true\r
-Trackpoint N30 03.692 W91 36.317 25/05/2002 17:14:41 221 m 0:01:53 7 kph 114° true\r
-Trackpoint N30 03.587 W91 35.964 25/05/2002 17:17:16 599 m 0:02:35 14 kph 109° true\r
-Trackpoint N30 03.468 W91 35.801 25/05/2002 17:17:46 342 m 0:00:30 41 kph 130° true\r
-Trackpoint N30 03.323 W91 35.694 25/05/2002 17:18:20 319 m 0:00:34 34 kph 147° true\r
-Trackpoint N30 03.233 W91 35.557 25/05/2002 17:19:01 276 m 0:00:41 24 kph 127° true\r
-Trackpoint N30 02.984 W91 35.385 25/05/2002 17:20:46 538 m 0:01:45 18 kph 149° true\r
-Trackpoint N30 02.941 W91 35.393 25/05/2002 17:21:10 81 m 0:00:24 12 kph 189° true\r
-Trackpoint N30 02.928 W91 35.576 25/05/2002 17:21:51 295 m 0:00:41 26 kph 265° true\r
-Trackpoint N30 02.774 W91 35.787 25/05/2002 17:22:35 443 m 0:00:44 36 kph 230° true\r
-Trackpoint N30 02.731 W91 35.923 25/05/2002 17:23:08 233 m 0:00:33 25 kph 250° true\r
-Trackpoint N30 02.838 W91 36.016 25/05/2002 18:04:23 248 m 0:41:15 0.4 kph 323° true\r
-Trackpoint N30 02.820 W91 35.978 25/05/2002 18:06:04 2 m 70 m 0:01:41 2 kph 119° true\r
-Trackpoint N30 02.786 W91 35.968 25/05/2002 18:07:06 65 m 0:01:02 4 kph 166° true\r
-Trackpoint N30 02.772 W91 35.937 25/05/2002 18:08:18 1 m 56 m 0:01:12 3 kph 117° true\r
-Trackpoint N30 02.782 W91 35.864 25/05/2002 18:10:20 119 m 0:02:02 4 kph 81° true\r
-Trackpoint N30 02.781 W91 35.830 25/05/2002 18:11:09 55 m 0:00:49 4 kph 92° true\r
-Trackpoint N30 02.807 W91 35.780 25/05/2002 18:12:18 94 m 0:01:09 5 kph 59° true\r
-Trackpoint N30 02.847 W91 35.712 25/05/2002 18:14:22 132 m 0:02:04 4 kph 56° true\r
-Trackpoint N30 02.868 W91 35.686 25/05/2002 18:15:04 2 m 57 m 0:00:42 5 kph 47° true\r
-Trackpoint N30 02.895 W91 35.645 25/05/2002 18:16:14 1 m 83 m 0:01:10 4 kph 53° true\r
-Trackpoint N30 02.921 W91 35.628 25/05/2002 18:17:01 1 m 55 m 0:00:47 4 kph 30° true\r
-Trackpoint N30 02.961 W91 35.631 25/05/2002 18:18:07 74 m 0:01:06 4 kph 356° true\r
-Trackpoint N30 03.019 W91 35.639 25/05/2002 18:19:51 2 m 108 m 0:01:44 4 kph 353° true\r
-Trackpoint N30 03.047 W91 35.647 25/05/2002 18:20:39 53 m 0:00:48 4 kph 346° true\r
-Trackpoint N30 03.074 W91 35.662 25/05/2002 18:21:24 56 m 0:00:45 4 kph 334° true\r
-Trackpoint N30 03.108 W91 35.662 25/05/2002 18:22:17 63 m 0:00:53 4 kph 360° true\r
-Trackpoint N30 03.133 W91 35.680 25/05/2002 18:23:18 55 m 0:01:01 3 kph 328° true\r
-Trackpoint N30 03.181 W91 35.681 25/05/2002 18:24:37 89 m 0:01:19 4 kph 359° true\r
-Trackpoint N30 03.292 W91 35.712 25/05/2002 18:28:13 6 m 212 m 0:03:36 4 kph 346° true\r
-Trackpoint N30 03.224 W91 35.696 25/05/2002 18:31:36 2 m 129 m 0:03:23 2 kph 168° true\r
-Trackpoint N30 03.191 W91 35.687 25/05/2002 18:32:56 63 m 0:01:20 3 kph 167° true\r
-Trackpoint N30 03.158 W91 35.690 25/05/2002 18:34:02 61 m 0:01:06 3 kph 184° true\r
-Trackpoint N30 03.147 W91 35.726 25/05/2002 18:36:03 61 m 0:02:01 2 kph 251° true\r
-Trackpoint N30 03.149 W91 35.758 25/05/2002 18:36:48 52 m 0:00:45 4 kph 274° true\r
-Trackpoint N30 03.159 W91 35.807 25/05/2002 18:37:52 1 m 81 m 0:01:04 5 kph 283° true\r
-Trackpoint N30 03.188 W91 35.871 25/05/2002 18:39:18 116 m 0:01:26 5 kph 298° true\r
-Trackpoint N30 03.217 W91 35.878 25/05/2002 18:40:15 55 m 0:00:57 3 kph 348° true\r
-Trackpoint N30 03.238 W91 35.866 25/05/2002 18:41:25 6 m 43 m 0:01:10 2 kph 26° true\r
-Trackpoint N30 03.217 W91 35.885 25/05/2002 18:42:37 49 m 0:01:12 2 kph 218° true\r
-Trackpoint N30 03.192 W91 35.875 25/05/2002 18:44:01 49 m 0:01:24 2 kph 161° true\r
-Trackpoint N30 03.169 W91 35.851 25/05/2002 18:45:53 57 m 0:01:52 2 kph 138° true\r
-Trackpoint N30 03.154 W91 35.816 25/05/2002 18:46:54 63 m 0:01:01 4 kph 116° true\r
-Trackpoint N30 03.140 W91 35.786 25/05/2002 18:47:42 55 m 0:00:48 4 kph 118° true\r
-Trackpoint N30 03.135 W91 35.741 25/05/2002 18:48:41 73 m 0:00:59 4 kph 97° true\r
-Trackpoint N30 03.133 W91 35.701 25/05/2002 18:49:52 64 m 0:01:11 3 kph 93° true\r
-Trackpoint N30 03.113 W91 35.682 25/05/2002 18:50:49 48 m 0:00:57 3 kph 141° true\r
-Trackpoint N30 03.063 W91 35.664 25/05/2002 18:52:14 97 m 0:01:25 4 kph 163° true\r
-Trackpoint N30 03.034 W91 35.654 25/05/2002 18:52:56 56 m 0:00:42 5 kph 163° true\r
-Trackpoint N30 03.011 W91 35.646 25/05/2002 18:53:38 45 m 0:00:42 4 kph 163° true\r
-Trackpoint N30 02.946 W91 35.623 25/05/2002 18:55:11 126 m 0:01:33 5 kph 163° true\r
-Trackpoint N30 02.907 W91 35.655 25/05/2002 18:56:32 89 m 0:01:21 4 kph 215° true\r
-Trackpoint N30 02.885 W91 35.685 25/05/2002 18:57:24 63 m 0:00:52 4 kph 230° true\r
-Trackpoint N30 02.850 W91 35.727 25/05/2002 18:58:40 7 m 94 m 0:01:16 4 kph 226° true\r
-Trackpoint N30 02.824 W91 35.760 25/05/2002 18:59:28 72 m 0:00:48 5 kph 228° true\r
-Trackpoint N30 02.798 W91 35.796 25/05/2002 19:00:22 75 m 0:00:54 5 kph 230° true\r
-Trackpoint N30 02.784 W91 35.859 25/05/2002 19:01:41 105 m 0:01:19 5 kph 256° true\r
-Trackpoint N30 02.774 W91 35.908 25/05/2002 19:02:48 81 m 0:01:07 4 kph 257° true\r
-Trackpoint N30 02.779 W91 35.938 25/05/2002 19:03:43 49 m 0:00:55 3 kph 281° true\r
-Trackpoint N30 02.807 W91 35.957 25/05/2002 19:04:49 60 m 0:01:06 3 kph 330° true\r
-Trackpoint N30 02.828 W91 35.980 25/05/2002 19:05:57 54 m 0:01:08 3 kph 317° true\r
+++ /dev/null
-Version 2:G7T\r
-#Sat Apr 14 21:27:12 2007 GMT\r
-#Sinnotts Radius=6371.0 km\r
-D WGS-72\r
-M UTM\r
-Z 0.000000\r
-A Feet ->Altitude/Depth units for this file\r
-#Velocity units Statute miles per hour\r
-C Category 1,Category 2,Category 3,Category 4,Category 5,Category 6,Category 7,Category 8,Category 9,Category 10,Category 11,Category 12,Category 13,Category 14,Category 15,Category 16\r
-\r
-W 5058ROAD 19T 325561.6 4700804.1 Sat Jun 02 00:18:14 2001 ROAD CROSSING ^ 18^Black ^S+N^0\r
-cA 5058ROAD|||||\r
-cB |||0|0|1.0e25\r
-cC 177.000001|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.415 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5058ROAD 19T 325561.6 4700804.1 Sat Jun 02 00:18:14 2001 ROAD CROSSING ^ 18^Black ^S+N^0\r
-cA 5058ROAD|||||\r
-cB |||0|0|1.0e25\r
-cC 177.000001|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.415 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5066 19T 325694.0 4700676.9 Wed Nov 28 21:05:28 2001 5066 ^ 8238^Black ^S+N^0\r
-cA 5066|||||\r
-cB |||0|0|1.0e25\r
-cC 146.281325|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.400 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5066 19T 325694.0 4700676.9 Wed Nov 28 21:05:28 2001 ^ 8238^Black ^S+N^0\r
-cA 5066|||||\r
-cB |||0|0|1.0e25\r
-cC 146.281325|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.400 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5067 19T 325661.1 4700716.5 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 5067|||||\r
-cB |||0|0|1.0e25\r
-cC 189.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.400 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5067 19T 325661.1 4700716.5 Sat Jun 02 03:26:55 2001 5067 ^ 18^Black ^S+N^0\r
-cA 5067|||||\r
-cB |||0|0|1.0e25\r
-cC 189.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.400 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5096 19T 325951.7 4700674.8 Fri Nov 16 23:03:38 2001 5096 ^ 18^Black ^S+N^0\r
-cA 5096|||||\r
-cB |||0|0|1.0e25\r
-cC 147.069896|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.276 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5096 19T 325951.7 4700674.8 Fri Nov 16 23:03:38 2001 ^ 18^Black ^S+N^0\r
-cA 5096|||||\r
-cB |||0|0|1.0e25\r
-cC 147.069896|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.276 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5142 19T 325480.4 4701240.7 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 5142|||||\r
-cB |||0|0|1.0e25\r
-cC 165.993197|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.285 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5142 19T 325480.4 4701240.7 Wed Nov 28 21:05:28 2001 5142 ^ 18^Black ^S+N^0\r
-cA 5142|||||\r
-cB |||0|0|1.0e25\r
-cC 165.993197|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.285 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5144SUMMIT 19T 325418.6 4701403.9 Wed Nov 28 21:05:28 2001 ^ 8246^Black ^S+N^0\r
-cA 5144SUMMIT|||||\r
-cB |||0|0|1.0e25\r
-cC 202.263459|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.252 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5144SUMMIT 19T 325418.6 4701403.9 Wed Nov 28 21:05:28 2001 Summit ^ 8246^Black ^S+N^0\r
-cA 5144SUMMIT|||||\r
-cB |||0|0|1.0e25\r
-cC 202.263459|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.252 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5148NANEPA 19T 325474.0 4701892.1 Wed Nov 07 23:53:41 2001 Nanepashemet Road Crossing ^ 18^Black ^S+N^0\r
-cA 5148NANEPA|||||\r
-cB |||0|0|1.0e25\r
-cC 393.074416|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.036 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5148NANEPA 19T 325474.0 4701892.1 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA 5148NANEPA|||||\r
-cB |||0|0|1.0e25\r
-cC 393.074416|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.036 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5150TANK 19T 325504.6 4700998.2 Sat Jun 02 00:18:16 2001 WATER TANK ^ 8211^Black ^S+N^0\r
-cA 5150TANK|||||\r
-cB |||0|0|1.0e25\r
-cC 221.000006|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.367 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5150TANK 19T 325504.6 4700998.2 Sat Jun 02 00:18:16 2001 WATER TANK ^ 8211^Black ^S+N^0\r
-cA 5150TANK|||||\r
-cB |||0|0|1.0e25\r
-cC 221.000006|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.367 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5156 19T 325538.9 4701616.4 Sat Jun 02 03:26:58 2001 ^ 18^Black ^S+N^0\r
-cA 5156|||||\r
-cB |||0|0|1.0e25\r
-cC 418.999990|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.111 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5156 19T 325538.9 4701616.4 Sat Jun 02 03:26:58 2001 5156 ^ 18^Black ^S+N^0\r
-cA 5156|||||\r
-cB |||0|0|1.0e25\r
-cC 418.999990|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.111 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5179DEAD 19T 325722.8 4701897.1 Sat Jun 02 03:26:59 2001 Dead End ^ 166^Black ^S+N^0\r
-cA 5179DEAD|||||\r
-cB |||0|0|1.0e25\r
-cC 383.999992|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.913 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5224 19T 325260.1 4702465.0 Sat Jun 02 03:26:59 2001 5224 ^ 18^Black ^S+N^0\r
-cA 5224|||||\r
-cB |||0|0|1.0e25\r
-cC 317.999997|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.918 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5229 19T 325280.5 4702931.9 Sat Jun 02 03:26:59 2001 5229 ^ 18^Black ^S+N^0\r
-cA 5229|||||\r
-cB |||0|0|1.0e25\r
-cC 270.999999|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.727 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5236BRIDGE 19T 325300.9 4702641.4 Sat Jun 02 03:26:59 2001 Bridge ^ 8233^Black ^S+N^0\r
-cA 5236BRIDGE|||||\r
-cB |||0|0|1.0e25\r
-cC 295.000001|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.830 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5237 19T 325316.9 4702697.6 Sat Jun 02 03:26:59 2001 5237 ^ 18^Black ^S+N^0\r
-cA 5237|||||\r
-cB |||0|0|1.0e25\r
-cC 272.000005|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.800 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5239ROAD 19T 325315.1 4702953.1 Sat Jun 02 03:27:00 2001 Road ^ 176^Black ^S+N^0\r
-cA 5239ROAD|||||\r
-cB |||0|0|1.0e25\r
-cC 265.999992|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.702 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5252PURPLE 19T 325574.9 4702277.5 Wed Nov 07 23:53:41 2001 ^ 8246^Black ^S+N^0\r
-cA 5252PURPLE|||||\r
-cB |||0|0|1.0e25\r
-cC 255.879480|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.838 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5252PURPLE 19T 325574.9 4702277.5 Wed Nov 07 23:53:41 2001 Purple Rock Hill ^ 8246^Black ^S+N^0\r
-cA 5252PURPLE|||||\r
-cB |||0|0|1.0e25\r
-cC 255.879480|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.838 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5254 19T 325596.2 4702404.2 Wed Nov 28 21:05:28 2001 5254 ^ 18^Black ^S+N^0\r
-cA 5254|||||\r
-cB |||0|0|1.0e25\r
-cC 218.821047|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.778 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5258 19T 325525.9 4702077.2 Wed Nov 07 23:53:41 2001 5258 ^ 18^Black ^S+N^0\r
-cA 5258|||||\r
-cB |||0|0|1.0e25\r
-cC 244.840687|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.939 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5258 19T 325525.9 4702077.2 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA 5258|||||\r
-cB |||0|0|1.0e25\r
-cC 244.840687|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.939 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5264 19T 325623.4 4702403.8 Wed Nov 28 21:05:28 2001 5264 ^ 18^Black ^S+N^0\r
-cA 5264|||||\r
-cB |||0|0|1.0e25\r
-cC 214.090422|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.765 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 526708 19T 325601.0 4702777.4 Sat Jun 02 03:27:00 2001 526708 ^ 18^Black ^S+N^0\r
-cA 526708|||||\r
-cB |||0|0|1.0e25\r
-cC 253.999990|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.632 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 526750 19T 325659.4 4702701.3 Sat Jun 02 03:27:00 2001 526750 ^ 18^Black ^S+N^0\r
-cA 526750|||||\r
-cB |||0|0|1.0e25\r
-cC 245.000008|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.633 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5267OBSTAC 19T 325698.7 4702733.5 Sat Jun 02 03:27:00 2001 Obstacle ^ 8204^Black ^S+N^0\r
-cA 5267OBSTAC|||||\r
-cB |||0|0|1.0e25\r
-cC 241.999989|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.601 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5267OBSTAC 19T 325698.7 4702733.5 Sat Jun 02 03:27:00 2001 ^ 8204^Black ^S+N^0\r
-cA 5267OBSTAC|||||\r
-cB |||0|0|1.0e25\r
-cC 241.999989|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.601 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 527614 19T 325710.4 4702644.8 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA 527614|||||\r
-cB |||0|0|1.0e25\r
-cC 258.245193|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.630 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 527614 19T 325710.4 4702644.8 Wed Nov 07 23:53:41 2001 527614 ^ 18^Black ^S+N^0\r
-cA 527614|||||\r
-cB |||0|0|1.0e25\r
-cC 258.245193|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.630 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 527631 19T 325735.7 4702606.4 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA 527631|||||\r
-cB |||0|0|1.0e25\r
-cC 258.245193|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.632 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 527631 19T 325735.7 4702606.4 Wed Nov 07 23:53:41 2001 527631 ^ 18^Black ^S+N^0\r
-cA 527631|||||\r
-cB |||0|0|1.0e25\r
-cC 258.245193|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.632 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5278 19T 325759.2 4702816.5 Sat Jun 02 03:27:00 2001 ^ 18^Black ^S+N^0\r
-cA 5278|||||\r
-cB |||0|0|1.0e25\r
-cC 224.000000|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.540 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5278 19T 325759.2 4702816.5 Sat Jun 02 03:27:00 2001 5278 ^ 18^Black ^S+N^0\r
-cA 5278|||||\r
-cB |||0|0|1.0e25\r
-cC 224.000000|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.540 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5278ROAD 19T 325772.8 4702886.6 Sat Jun 02 03:27:01 2001 Road ^ 176^Black ^S+N^0\r
-cA 5278ROAD|||||\r
-cB |||0|0|1.0e25\r
-cC 221.000006|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.506 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5287WATER 19T 325894.0 4702767.1 Sat Jun 02 03:27:01 2001 Reservoir ^ 163^Black ^S+N^0\r
-cA 5287WATER|||||\r
-cB |||0|0|1.0e25\r
-cC 222.999993|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.493 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5289 19T 325881.1 4702950.0 Sat Jun 02 03:27:01 2001 5289 ^ 18^Black ^S+N^0\r
-cA 5289|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.429 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5289 19T 325881.1 4702950.0 Sat Jun 02 03:27:01 2001 ^ 18^Black ^S+N^0\r
-cA 5289|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.429 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5299DEAD 19T 325978.0 4702975.6 Sat Jun 02 03:27:01 2001 Dead End ^ 166^Black ^S+N^0\r
-cA 5299DEAD|||||\r
-cB |||0|0|1.0e25\r
-cC 228.000000|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.372 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5374FIRE 19T 325718.9 4703488.0 Wed Nov 28 21:05:28 2001 5374FIRE ^ 18^Black ^S+N^0\r
-cA 5374FIRE|||||\r
-cB |||0|0|1.0e25\r
-cC 173.877706|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.299 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5374FIRE 19T 325718.9 4703488.0 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 5374FIRE|||||\r
-cB |||0|0|1.0e25\r
-cC 173.877706|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.299 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5376 19T 325758.3 4703650.1 Sat Jun 02 03:27:02 2001 5376 ^ 18^Black ^S+N^0\r
-cA 5376|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.217 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5376 19T 325758.3 4703650.1 Sat Jun 02 03:27:02 2001 ^ 18^Black ^S+N^0\r
-cA 5376|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.217 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5376BRIDGE 19T 325724.4 4703663.0 Sat Jun 02 03:27:01 2001 Bridge ^ 8233^Black ^S+N^0\r
-cA 5376BRIDGE|||||\r
-cB |||0|0|1.0e25\r
-cC 181.999995|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.229 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5376DEAD 19T 325778.5 4703631.2 Sat Jun 02 03:27:02 2001 Dead End ^ 166^Black ^S+N^0\r
-cA 5376DEAD|||||\r
-cB |||0|0|1.0e25\r
-cC 187.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.215 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5376STREAM 19T 325764.8 4703679.1 Wed Nov 07 23:53:41 2001 Stream Crossing ^ 8233^Black ^S+N^0\r
-cA 5376STREAM|||||\r
-cB |||0|0|1.0e25\r
-cC 211.724709|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.203 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5376STREAM 19T 325764.8 4703679.1 Wed Nov 07 23:53:41 2001 ^ 8233^Black ^S+N^0\r
-cA 5376STREAM|||||\r
-cB |||0|0|1.0e25\r
-cC 211.724709|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.203 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6006 19T 326091.0 4700682.6 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 6006|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.205 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6006 19T 326091.0 4700682.6 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 6006|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.205 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6006 19T 326091.0 4700682.6 Sat Jun 02 03:26:55 2001 600698 ^ 18^Black ^S+N^0\r
-cA 6006|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.205 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6006BLUE 19T 326061.3 4700636.2 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 6006BLUE|||||\r
-cB |||0|0|1.0e25\r
-cC 151.012351|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.237 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6006BLUE 19T 326061.3 4700636.2 Wed Nov 28 21:05:28 2001 6006BLUE ^ 18^Black ^S+N^0\r
-cA 6006BLUE|||||\r
-cB |||0|0|1.0e25\r
-cC 151.012351|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.237 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6014MEADOW 19T 326186.1 4700429.0 Wed Nov 28 21:05:28 2001 6014MEADOW ^ 18^Black ^S+N^0\r
-cA 6014MEADOW|||||\r
-cB |||0|0|1.0e25\r
-cC 123.415169|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.257 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6014MEADOW 19T 326186.1 4700429.0 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 6014MEADOW|||||\r
-cB |||0|0|1.0e25\r
-cC 123.415169|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.257 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6014MEADOW 19T 326186.1 4700429.0 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 6014MEADOW|||||\r
-cB |||0|0|1.0e25\r
-cC 123.415169|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.257 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6016 19T 326121.0 4700642.7 Wed Nov 28 21:05:28 2001 Bike Loop Connector ^ 18^Black ^S+N^0\r
-cA 6016|||||\r
-cB |||0|0|1.0e25\r
-cC 142.338470|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.206 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6029 19T 326200.2 4700983.9 Sat Jun 02 03:26:55 2001 6029 ^ 18^Black ^S+N^0\r
-cA 6029|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.035 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6029 19T 326200.2 4700983.9 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 6029|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.035 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6042CROSS 19T 326475.3 4700279.0 Sat Jun 02 03:27:05 2001 Crossing ^ 8238^Black ^S+N^0\r
-cA 6042CROSS|||||\r
-cB |||0|0|1.0e25\r
-cC 148.000004|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.175 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6053 19T 326525.9 4700363.4 Sat Jun 02 03:27:05 2001 6053 ^ 18^Black ^S+N^0\r
-cA 6053|||||\r
-cB |||0|0|1.0e25\r
-cC 164.999999|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.118 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6066 19T 326663.7 4700694.1 Sat Jun 02 03:26:57 2001 6066 ^ 18^Black ^S+N^0\r
-cA 6066|||||\r
-cB |||0|0|1.0e25\r
-cC 84.000003|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.923 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6067 19T 326658.4 4700751.4 Sat Jun 02 03:26:57 2001 6067 ^ 18^Black ^S+N^0\r
-cA 6067|||||\r
-cB |||0|0|1.0e25\r
-cC 113.000006|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.903 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6071 19T 326785.1 4700192.9 Sat Jun 02 03:26:57 2001 6071 ^ 18^Black ^S+N^0\r
-cA 6071|||||\r
-cB |||0|0|1.0e25\r
-cC 99.999998|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.058 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6073 19T 326721.5 4700032.0 Sat Jun 02 03:26:56 2001 6073 ^ 18^Black ^S+N^0\r
-cA 6073|||||\r
-cB |||0|0|1.0e25\r
-cC 49.999999|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.151 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6077LOGS 19T 326742.1 4700720.2 Sat Jun 02 00:18:16 2001 Log Crossing ^ 8204^Black ^S+N^0\r
-cA 6077LOGS|||||\r
-cB |||0|0|1.0e25\r
-cC 105.000005|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.875 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6084 19T 326882.9 4700476.2 Sat Jun 02 03:26:57 2001 6084 ^ 18^Black ^S+N^0\r
-cA 6084|||||\r
-cB |||0|0|1.0e25\r
-cC 124.000001|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.901 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6121DEAD 19T 326248.8 4701133.2 Sat Jun 02 03:26:57 2001 Dead End ^ 166^Black ^S+N^0\r
-cA 6121DEAD|||||\r
-cB |||0|0|1.0e25\r
-cC 183.999995|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.954 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6130 19T 326386.1 4701028.3 Sat Jun 02 03:26:55 2001 6130 ^ 18^Black ^S+N^0\r
-cA 6130|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.928 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6130 19T 326386.1 4701028.3 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 6130|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.928 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6131 19T 326349.9 4701116.5 Sat Jun 02 03:26:58 2001 ^ 18^Black ^S+N^0\r
-cA 6131|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.911 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6131 19T 326349.9 4701116.5 Sat Jun 02 03:26:58 2001 6131 ^ 18^Black ^S+N^0\r
-cA 6131|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.911 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6153 19T 326565.3 4701310.2 Sat Jun 02 03:27:05 2001 6153 ^ 18^Black ^S+N^0\r
-cA 6153|||||\r
-cB |||0|0|1.0e25\r
-cC 205.999998|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.732 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6153 19T 326565.3 4701310.2 Sat Jun 02 03:27:05 2001 ^ 18^Black ^S+N^0\r
-cA 6153|||||\r
-cB |||0|0|1.0e25\r
-cC 205.999998|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.732 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6155DEAD 19T 326579.0 4701534.3 Sat Jun 02 03:27:04 2001 Dead End ^ 166^Black ^S+N^0\r
-cA 6155DEAD|||||\r
-cB |||0|0|1.0e25\r
-cC 201.000003|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.638 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6171 19T 326774.3 4701173.8 Sat Jun 02 03:27:05 2001 6171 ^ 18^Black ^S+N^0\r
-cA 6171|||||\r
-cB |||0|0|1.0e25\r
-cC 181.999995|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.683 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6171 19T 326774.3 4701173.8 Sat Jun 02 03:27:05 2001 ^ 18^Black ^S+N^0\r
-cA 6171|||||\r
-cB |||0|0|1.0e25\r
-cC 181.999995|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.683 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6176 19T 326759.4 4701642.2 Sat Jun 02 03:27:04 2001 ^ 18^Black ^S+N^0\r
-cA 6176|||||\r
-cB |||0|0|1.0e25\r
-cC 205.000004|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.509 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6176 19T 326759.4 4701642.2 Sat Jun 02 03:27:04 2001 6176 ^ 18^Black ^S+N^0\r
-cA 6176|||||\r
-cB |||0|0|1.0e25\r
-cC 205.000004|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.509 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6177 19T 326799.5 4701712.8 Sat Jun 02 03:27:04 2001 6177 ^ 18^Black ^S+N^0\r
-cA 6177|||||\r
-cB |||0|0|1.0e25\r
-cC 203.999997|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.462 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6177 19T 326799.5 4701712.8 Sat Jun 02 03:27:04 2001 ^ 18^Black ^S+N^0\r
-cA 6177|||||\r
-cB |||0|0|1.0e25\r
-cC 203.999997|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.462 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6181CROSS 19T 326807.5 4701106.4 Sat Jun 02 03:27:05 2001 Crossing ^ 8238^Black ^S+N^0\r
-cA 6181CROSS|||||\r
-cB |||0|0|1.0e25\r
-cC 173.000000|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.693 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6272 19T 326723.2 4702268.7 Sat Jun 02 03:26:56 2001 6272 ^ 18^Black ^S+N^0\r
-cA 6272|||||\r
-cB |||0|0|1.0e25\r
-cC 240.000001|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.284 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6272 19T 326761.8 4702265.6 Sat Jun 02 03:26:55 2001 6272 ^ 18^Black ^S+N^0\r
-cA 6272|||||\r
-cB |||0|0|1.0e25\r
-cC 229.000006|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.267 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6278 19T 326776.2 4702807.8 Sat Jun 02 03:27:04 2001 6278 ^ 18^Black ^S+N^0\r
-cA 6278|||||\r
-cB |||0|0|1.0e25\r
-cC 229.999988|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.050 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6280 19T 326869.0 4702042.4 Fri Nov 16 23:03:38 2001 6280 ^ 18^Black ^S+N^0\r
-cA 6280|||||\r
-cB |||0|0|1.0e25\r
-cC 188.858953|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.301 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6280 19T 326869.0 4702042.4 Fri Nov 16 23:03:38 2001 ^ 18^Black ^S+N^0\r
-cA 6280|||||\r
-cB |||0|0|1.0e25\r
-cC 188.858953|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.301 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6283 19T 326892.6 4702310.1 Fri Nov 16 23:03:38 2001 6283 ^ 18^Black ^S+N^0\r
-cA 6283|||||\r
-cB |||0|0|1.0e25\r
-cC 218.821047|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.186 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6283 19T 326892.6 4702310.1 Fri Nov 16 23:03:38 2001 ^ 18^Black ^S+N^0\r
-cA 6283|||||\r
-cB |||0|0|1.0e25\r
-cC 218.821047|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.186 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6289 19T 326830.3 4702994.0 Fri Nov 16 23:03:38 2001 ^ 18^Black ^S+N^0\r
-cA 6289|||||\r
-cB |||0|0|1.0e25\r
-cC 239.321491|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.951 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6289 19T 326830.3 4702994.0 Fri Nov 16 23:03:38 2001 6289 ^ 18^Black ^S+N^0\r
-cA 6289|||||\r
-cB |||0|0|1.0e25\r
-cC 239.321491|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.951 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6297 19T 326910.4 4702728.7 Sat Jun 02 03:27:04 2001 6297 ^ 18^Black ^S+N^0\r
-cA 6297|||||\r
-cB |||0|0|1.0e25\r
-cC 238.999995|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.015 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6297 19T 326910.4 4702728.7 Sat Jun 02 03:27:04 2001 ^ 18^Black ^S+N^0\r
-cA 6297|||||\r
-cB |||0|0|1.0e25\r
-cC 238.999995|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.015 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6328 19T 326241.2 4703800.2 Sat Jun 02 03:27:02 2001 6328 ^ 18^Black ^S+N^0\r
-cA 6328|||||\r
-cB |||0|0|1.0e25\r
-cC 175.999994|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.925 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6328 19T 326241.2 4703800.2 Sat Jun 02 03:27:02 2001 ^ 18^Black ^S+N^0\r
-cA 6328|||||\r
-cB |||0|0|1.0e25\r
-cC 175.999994|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.925 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6353DEAD 19T 326524.2 4703311.6 Sat Jun 02 03:27:03 2001 Dead End ^ 166^Black ^S+N^0\r
-cA 6353DEAD|||||\r
-cB |||0|0|1.0e25\r
-cC 154.000004|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.977 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6354 19T 326538.3 4703469.7 Sat Jun 02 03:27:03 2001 6354 ^ 18^Black ^S+N^0\r
-cA 6354|||||\r
-cB |||0|0|1.0e25\r
-cC 144.000003|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.909 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 635722 19T 326527.7 4703720.8 Sat Jun 02 03:27:02 2001 ^ 18^Black ^S+N^0\r
-cA 635722|||||\r
-cB |||0|0|1.0e25\r
-cC 160.000005|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.817 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 635722 19T 326527.7 4703720.8 Sat Jun 02 03:27:02 2001 635722 ^ 18^Black ^S+N^0\r
-cA 635722|||||\r
-cB |||0|0|1.0e25\r
-cC 160.000005|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.817 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 635783 19T 326582.0 4703730.3 Sat Jun 02 03:27:02 2001 635783 ^ 18^Black ^S+N^0\r
-cA 635783|||||\r
-cB |||0|0|1.0e25\r
-cC 160.999999|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.787 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 635783 19T 326582.0 4703730.3 Sat Jun 02 03:27:02 2001 ^ 18^Black ^S+N^0\r
-cA 635783|||||\r
-cB |||0|0|1.0e25\r
-cC 160.999999|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.787 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6373 19T 326762.1 4703385.6 Sat Jun 02 03:27:03 2001 ^ 18^Black ^S+N^0\r
-cA 6373|||||\r
-cB |||0|0|1.0e25\r
-cC 205.000004|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.833 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6373 19T 326762.1 4703385.6 Sat Jun 02 03:27:03 2001 6373 ^ 18^Black ^S+N^0\r
-cA 6373|||||\r
-cB |||0|0|1.0e25\r
-cC 205.000004|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.833 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6634 19T 326332.9 4696457.9 Sat Jun 02 03:26:56 2001 6634 ^ 18^Black ^S+N^0\r
-cA 6634|||||\r
-cB |||0|0|1.0e25\r
-cC 13.000000|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3790.724 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6979 19T 326725.1 4699956.0 Sat Jun 02 03:26:56 2001 6979 ^ 18^Black ^S+N^0\r
-cA 6979|||||\r
-cB |||0|0|1.0e25\r
-cC 43.999999|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.179 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6997 19T 326609.6 4699782.4 Fri Nov 16 23:03:38 2001 6997 ^ 18^Black ^S+N^0\r
-cA 6997|||||\r
-cB |||0|0|1.0e25\r
-cC 111.588205|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.302 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W BEAR HILL 19T 326748.2 4703629.5 Sat Jun 02 03:27:03 2001 BEAR HILL TOWER ^16391^Black ^S+N^0\r
-cA BEAR HILL|||||\r
-cB |||0|0|1.0e25\r
-cC 288.000007|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.745 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W BEAR HILL 19T 326748.2 4703629.5 Sat Jun 02 03:27:03 2001 BEAR HILL TOWER ^16391^Black ^S+N^0\r
-cA BEAR HILL|||||\r
-cB |||0|0|1.0e25\r
-cC 288.000007|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.745 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W BELLEVUE 19T 326630.3 4699772.7 Sat Jun 02 00:18:15 2001 BELLEVUE ^ 158^Black ^S+N^0\r
-cA BELLEVUE|||||\r
-cB |||0|0|1.0e25\r
-cC 77.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.296 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W BELLEVUE 19T 326630.3 4699772.7 Sat Jun 02 00:18:15 2001 BELLEVUE ^ 158^Black ^S+N^0\r
-cA BELLEVUE|||||\r
-cB |||0|0|1.0e25\r
-cC 77.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.296 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W BELLEVUE 19T 326630.3 4699772.7 Sat Jun 02 00:18:15 2001 BELLEVUE ^ 158^Black ^S+N^0\r
-cA BELLEVUE|||||\r
-cB |||0|0|1.0e25\r
-cC 77.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.296 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W DARKHOLLPO 19T 327033.8 4702825.6 Sat Jul 16 20:53:40 2005 Dark Hollow Pond ^ 7^Black ^S+N^0\r
-cA DARKHOLLPO|||||\r
-cB |||0|0|1.0e25\r
-cC 1e25|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.918 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE14 19T 325125.9 4702060.7 Sat Jun 02 03:26:59 2001 Gate 14 ^ 176^Black ^S+N^0\r
-cA GATE14|||||\r
-cB |||0|0|1.0e25\r
-cC 363.999990|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.140 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE16 19T 325518.2 4702861.5 Sat Jun 02 03:27:00 2001 Gate 16 ^ 176^Black ^S+N^0\r
-cA GATE16|||||\r
-cB |||0|0|1.0e25\r
-cC 254.999997|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.639 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE17 19T 325754.1 4702953.0 Sat Jun 02 03:27:01 2001 Gate 17 ^ 176^Black ^S+N^0\r
-cA GATE17|||||\r
-cB |||0|0|1.0e25\r
-cC 215.999999|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.489 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE19 19T 325773.3 4703727.8 Sat Jun 02 03:27:02 2001 Gate 19 ^ 176^Black ^S+N^0\r
-cA GATE19|||||\r
-cB |||0|0|1.0e25\r
-cC 187.999996|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.180 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE21 19T 326728.7 4703959.8 Sat Jun 02 03:27:03 2001 Gate 21 ^ 176^Black ^S+N^0\r
-cA GATE21|||||\r
-cB |||0|0|1.0e25\r
-cC 162.000005|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.627 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE24 19T 327084.2 4702624.6 Sat Jun 02 03:27:03 2001 Gate 24 ^ 176^Black ^S+N^0\r
-cA GATE24|||||\r
-cB |||0|0|1.0e25\r
-cC 265.999992|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3787.971 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE5 19T 326624.9 4699761.4 Wed Nov 28 21:05:28 2001 Gate 5 ^ 176^Black ^S+N^0\r
-cA GATE5|||||\r
-cB |||0|0|1.0e25\r
-cC 70.587318|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.303 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE6 19T 326498.9 4699808.2 Wed Nov 07 23:53:41 2001 Gate 6 ^ 18^Black ^S+N^0\r
-cA GATE6|||||\r
-cB |||0|0|1.0e25\r
-cC 87.145307|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.346 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE6 19T 326498.9 4699808.2 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA GATE6|||||\r
-cB |||0|0|1.0e25\r
-cC 87.145307|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.346 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE6 19T 326498.9 4699808.2 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA GATE6|||||\r
-cB |||0|0|1.0e25\r
-cC 87.145307|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.346 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W PANTHRCAVE 19T 326451.1 4700224.9 Wed Nov 07 23:53:41 2001 ^ 8243^Black ^S+N^0\r
-cA PANTHRCAVE|||||\r
-cB |||0|0|1.0e25\r
-cC 148.646638|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.207 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W PANTHRCAVE 19T 326451.1 4700224.9 Wed Nov 07 23:53:41 2001 Panther Cave ^ 8243^Black ^S+N^0\r
-cA PANTHRCAVE|||||\r
-cB |||0|0|1.0e25\r
-cC 148.646638|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.207 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W PANTHRCAVE 19T 326451.1 4700224.9 Wed Nov 07 23:53:41 2001 ^ 8243^Black ^S+N^0\r
-cA PANTHRCAVE|||||\r
-cB |||0|0|1.0e25\r
-cC 148.646638|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3789.207 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W SHEEPFOLD 19T 326761.9 4702265.6 Sat Jun 02 00:18:13 2001 Sheepfold Parking Lot ^ 158^Black ^S+N^0\r
-cA SHEEPFOLD|||||\r
-cB |||0|0|1.0e25\r
-cC 229.000006|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.267 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-W SOAPBOX 19T 326711.2 4702549.2 Sat Jun 02 03:27:04 2001 Soap Box Derby Track ^ 8235^Black ^S+N^0\r
-cA SOAPBOX|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|3788.181 S mi\r
-cD 1.0e25|1.0e25|0\r
-\r
-N New Track Log Start - Trk from .gpx file,Black,1\r
-T 15R 633951.5 3326484.2 Sat May 25 17:06:21 2002 ;3.280840; 1e25; SM; 0.0000; 0.0000; 0.0000; INF; -;|1e25\r
-T 15R 633929.8 3326550.5 Sat May 25 17:09:55 2002 ; 1e25; 1e25; SM; 0.0434; 0.0434; 0.0434;0.730757; 214;|1e25\r
-T 15R 634151.6 3326544.0 Sat May 25 17:12:00 2002 ; 1e25; 1e25; SM; 0.1377; 0.1811; 0.1811;3.964510; 125;|1e25\r
-T 15R 634237.3 3326504.3 Sat May 25 17:12:48 2002 ; 1e25; 1e25; SM; 0.0586; 0.2397; 0.2397;4.397203; 48;|1e25\r
-T 15R 634440.8 3326418.2 Sat May 25 17:14:41 2002 ; 1e25; 1e25; SM; 0.1372; 0.3769; 0.3769;4.371133; 113;|1e25\r
-T 15R 635010.3 3326231.1 Sat May 25 17:17:16 2002 ; 1e25; 1e25; SM; 0.3720; 0.7489; 0.7489;8.640052; 155;|1e25\r
-T 15R 635275.0 3326014.6 Sat May 25 17:17:46 2002 ; 1e25; 1e25; SM; 0.2125; 0.9615; 0.9615;25.504435; 30;|1e25\r
-T 15R 635450.2 3325748.8 Sat May 25 17:18:20 2002 ; 1e25; 1e25; SM; 0.1981; 1.1596; 1.1596;20.979147; 34;|1e25\r
-T 15R 635672.3 3325585.3 Sat May 25 17:19:01 2002 ; 1e25; 1e25; SM; 0.1714; 1.3310; 1.3310;15.050832; 41;|1e25\r
-T 15R 635954.4 3325128.8 Sat May 25 17:20:46 2002 ; 1e25; 1e25; SM; 0.3341; 1.6651; 1.6651;11.454587; 105;|1e25\r
-T 15R 635942.5 3325049.3 Sat May 25 17:21:10 2002 ; 1e25; 1e25; SM; 0.0501; 1.7152; 1.7152;7.515936; 24;|1e25\r
-T 15R 635648.8 3325021.6 Sat May 25 17:21:51 2002 ; 1e25; 1e25; SM; 0.1830; 1.8982; 1.8982;16.070644; 41;|1e25\r
-T 15R 635313.2 3324732.9 Sat May 25 17:22:35 2002 ; 1e25; 1e25; SM; 0.2751; 2.1734; 2.1734;22.511499; 44;|1e25\r
-T 15R 635095.6 3324650.9 Sat May 25 17:23:08 2002 ; 1e25; 1e25; SM; 0.1443; 2.3177; 2.3177;15.745092; 33;|1e25\r
-T 15R 634943.7 3324846.7 Sat May 25 18:04:23 2002 ; 1e25; 1e25; SM; 0.1542; 2.4719; 2.4719;0.224257; 2475;|1e25\r
-T 15R 635005.2 3324814.2 Sat May 25 18:06:04 2002 ;6.561680; 1e25; SM; 0.0432; 2.5151; 2.5151;1.540302; 101;|1e25\r
-T 15R 635022.0 3324751.5 Sat May 25 18:07:06 2002 ; 1e25; 1e25; SM; 0.0404; 2.5555; 2.5555;2.346642; 62;|1e25\r
-T 15R 635072.2 3324726.3 Sat May 25 18:08:18 2002 ;3.280840; 1e25; SM; 0.0349; 2.5904; 2.5904;1.743045; 72;|1e25\r
-T 15R 635189.3 3324746.3 Sat May 25 18:10:20 2002 ; 1e25; 1e25; SM; 0.0737; 2.6641; 2.6641;2.174638; 122;|1e25\r
-T 15R 635243.9 3324745.1 Sat May 25 18:11:09 2002 ; 1e25; 1e25; SM; 0.0339; 2.6979; 2.6979;2.488559; 49;|1e25\r
-T 15R 635323.7 3324794.0 Sat May 25 18:12:18 2002 ; 1e25; 1e25; SM; 0.0582; 2.7561; 2.7561;3.034664; 69;|1e25\r
-T 15R 635432.0 3324869.3 Sat May 25 18:14:22 2002 ; 1e25; 1e25; SM; 0.0819; 2.8381; 2.8381;2.379163; 124;|1e25\r
-T 15R 635473.3 3324908.6 Sat May 25 18:15:04 2002 ;6.561680; 1e25; SM; 0.0354; 2.8735; 2.8735;3.037052; 42;|1e25\r
-T 15R 635538.6 3324959.3 Sat May 25 18:16:14 2002 ;3.280840; 1e25; SM; 0.0514; 2.9249; 2.9249;2.642554; 70;|1e25\r
-T 15R 635565.3 3325007.6 Sat May 25 18:17:01 2002 ;3.280840; 1e25; SM; 0.0344; 2.9593; 2.9593;2.632849; 47;|1e25\r
-T 15R 635559.6 3325081.5 Sat May 25 18:18:07 2002 ; 1e25; 1e25; SM; 0.0462; 3.0054; 3.0054;2.519028; 66;|1e25\r
-T 15R 635545.5 3325188.5 Sat May 25 18:19:51 2002 ;6.561680; 1e25; SM; 0.0673; 3.0727; 3.0727;2.329100; 104;|1e25\r
-T 15R 635531.9 3325240.0 Sat May 25 18:20:39 2002 ; 1e25; 1e25; SM; 0.0332; 3.1059; 3.1059;2.488490; 48;|1e25\r
-T 15R 635507.2 3325289.5 Sat May 25 18:21:24 2002 ; 1e25; 1e25; SM; 0.0345; 3.1404; 3.1404;2.760011; 45;|1e25\r
-T 15R 635506.4 3325352.4 Sat May 25 18:22:17 2002 ; 1e25; 1e25; SM; 0.0392; 3.1796; 3.1796;2.661007; 53;|1e25\r
-T 15R 635476.9 3325398.2 Sat May 25 18:23:18 2002 ; 1e25; 1e25; SM; 0.0339; 3.2135; 3.2135;2.003106; 61;|1e25\r
-T 15R 635474.3 3325486.9 Sat May 25 18:24:37 2002 ; 1e25; 1e25; SM; 0.0553; 3.2688; 3.2688;2.519224; 79;|1e25\r
-T 15R 635421.9 3325691.3 Sat May 25 18:28:13 2002 ;19.685039; 1e25; SM; 0.1315; 3.4003; 3.4003;2.191816; 216;|1e25\r
-T 15R 635449.2 3325565.9 Sat May 25 18:31:36 2002 ;6.561680; 1e25; SM; 0.0800; 3.4803; 3.4803;1.418052; 203;|1e25\r
-T 15R 635464.4 3325505.1 Sat May 25 18:32:56 2002 ; 1e25; 1e25; SM; 0.0390; 3.5193; 3.5193;1.757061; 80;|1e25\r
-T 15R 635460.4 3325444.1 Sat May 25 18:34:02 2002 ; 1e25; 1e25; SM; 0.0381; 3.5574; 3.5574;2.079208; 66;|1e25\r
-T 15R 635402.8 3325423.1 Sat May 25 18:36:03 2002 ; 1e25; 1e25; SM; 0.0380; 3.5955; 3.5955;1.131931; 121;|1e25\r
-T 15R 635351.2 3325426.2 Sat May 25 18:36:48 2002 ; 1e25; 1e25; SM; 0.0320; 3.6275; 3.6275;2.561370; 45;|1e25\r
-T 15R 635272.3 3325443.7 Sat May 25 18:37:52 2002 ;3.280840; 1e25; SM; 0.0501; 3.6776; 3.6776;2.820732; 64;|1e25\r
-T 15R 635168.8 3325496.0 Sat May 25 18:39:18 2002 ; 1e25; 1e25; SM; 0.0720; 3.7497; 3.7497;3.014423; 86;|1e25\r
-T 15R 635156.9 3325549.5 Sat May 25 18:40:15 2002 ; 1e25; 1e25; SM; 0.0342; 3.7838; 3.7838;2.157813; 57;|1e25\r
-T 15R 635175.7 3325588.5 Sat May 25 18:41:25 2002 ;19.685039; 1e25; SM; 0.0270; 3.8108; 3.8108;1.387488; 70;|1e25\r
-T 15R 635145.7 3325549.3 Sat May 25 18:42:37 2002 ; 1e25; 1e25; SM; 0.0307; 3.8415; 3.8415;1.534552; 72;|1e25\r
-T 15R 635162.3 3325503.3 Sat May 25 18:44:01 2002 ; 1e25; 1e25; SM; 0.0305; 3.8720; 3.8720;1.306042; 84;|1e25\r
-T 15R 635201.3 3325461.3 Sat May 25 18:45:53 2002 ; 1e25; 1e25; SM; 0.0357; 3.9076; 3.9076;1.146618; 112;|1e25\r
-T 15R 635258.0 3325434.3 Sat May 25 18:46:54 2002 ; 1e25; 1e25; SM; 0.0390; 3.9466; 3.9466;2.299515; 61;|1e25\r
-T 15R 635306.5 3325409.0 Sat May 25 18:47:42 2002 ; 1e25; 1e25; SM; 0.0340; 3.9806; 3.9806;2.549512; 48;|1e25\r
-T 15R 635378.9 3325400.7 Sat May 25 18:48:41 2002 ; 1e25; 1e25; SM; 0.0452; 4.0258; 4.0258;2.759120; 59;|1e25\r
-T 15R 635443.2 3325397.8 Sat May 25 18:49:52 2002 ; 1e25; 1e25; SM; 0.0399; 4.0657; 4.0657;2.022865; 71;|1e25\r
-T 15R 635474.2 3325361.2 Sat May 25 18:50:49 2002 ; 1e25; 1e25; SM; 0.0299; 4.0956; 4.0956;1.886267; 57;|1e25\r
-T 15R 635504.3 3325269.2 Sat May 25 18:52:14 2002 ; 1e25; 1e25; SM; 0.0603; 4.1559; 4.1559;2.553308; 85;|1e25\r
-T 15R 635521.0 3325215.9 Sat May 25 18:52:56 2002 ; 1e25; 1e25; SM; 0.0348; 4.1907; 4.1907;2.985822; 42;|1e25\r
-T 15R 635534.4 3325173.5 Sat May 25 18:53:38 2002 ; 1e25; 1e25; SM; 0.0277; 4.2184; 4.2184;2.374160; 42;|1e25\r
-T 15R 635572.8 3325053.9 Sat May 25 18:55:11 2002 ; 1e25; 1e25; SM; 0.0783; 4.2966; 4.2966;3.029246; 93;|1e25\r
-T 15R 635522.3 3324981.2 Sat May 25 18:56:32 2002 ; 1e25; 1e25; SM; 0.0551; 4.3517; 4.3517;2.447726; 81;|1e25\r
-T 15R 635474.6 3324940.0 Sat May 25 18:57:24 2002 ; 1e25; 1e25; SM; 0.0392; 4.3909; 4.3909;2.714362; 52;|1e25\r
-T 15R 635407.9 3324874.5 Sat May 25 18:58:40 2002 ;22.965879; 1e25; SM; 0.0581; 4.4490; 4.4490;2.751982; 76;|1e25\r
-T 15R 635355.4 3324825.9 Sat May 25 18:59:28 2002 ; 1e25; 1e25; SM; 0.0445; 4.4935; 4.4935;3.334841; 48;|1e25\r
-T 15R 635298.2 3324777.1 Sat May 25 19:00:22 2002 ; 1e25; 1e25; SM; 0.0468; 4.5403; 4.5403;3.117638; 54;|1e25\r
-T 15R 635197.2 3324750.0 Sat May 25 19:01:41 2002 ; 1e25; 1e25; SM; 0.0648; 4.6051; 4.6051;2.954261; 79;|1e25\r
-T 15R 635118.7 3324730.6 Sat May 25 19:02:48 2002 ; 1e25; 1e25; SM; 0.0502; 4.6553; 4.6553;2.697719; 67;|1e25\r
-T 15R 635070.4 3324739.3 Sat May 25 19:03:43 2002 ; 1e25; 1e25; SM; 0.0305; 4.6858; 4.6858;1.993899; 55;|1e25\r
-T 15R 635039.3 3324790.5 Sat May 25 19:04:49 2002 ; 1e25; 1e25; SM; 0.0373; 4.7231; 4.7231;2.036431; 66;|1e25\r
-T 15R 635001.8 3324828.9 Sat May 25 19:05:57 2002 ; 1e25; 1e25; SM; 0.0334; 4.7564; 4.7564;1.765615; 68;|1e25\r
-R 01 BELLEVUE\r
-W BELLEVUE 19T 326630.3 4699772.7 Sat Jun 02 00:18:15 2001 BELLEVUE ^ 158^Black ^S+N^0\r
-cA BELLEVUE|||||\r
-cB |||0|0|1.0e25\r
-cC 77.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE6 19T 326498.9 4699808.2 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA GATE6|||||\r
-cB |||0|0|1.0e25\r
-cC 87.145307|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W PANTHRCAVE 19T 326451.1 4700224.9 Wed Nov 07 23:53:41 2001 ^ 8243^Black ^S+N^0\r
-cA PANTHRCAVE|||||\r
-cB |||0|0|1.0e25\r
-cC 148.646638|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6014MEADOW 19T 326186.1 4700429.0 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 6014MEADOW|||||\r
-cB |||0|0|1.0e25\r
-cC 123.415169|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6006 19T 326091.0 4700682.6 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 6006|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6006BLUE 19T 326061.3 4700636.2 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 6006BLUE|||||\r
-cB |||0|0|1.0e25\r
-cC 151.012351|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5096 19T 325951.7 4700674.8 Fri Nov 16 23:03:38 2001 ^ 18^Black ^S+N^0\r
-cA 5096|||||\r
-cB |||0|0|1.0e25\r
-cC 147.069896|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5066 19T 325694.0 4700676.9 Wed Nov 28 21:05:28 2001 ^ 8238^Black ^S+N^0\r
-cA 5066|||||\r
-cB |||0|0|1.0e25\r
-cC 146.281325|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5067 19T 325661.1 4700716.5 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 5067|||||\r
-cB |||0|0|1.0e25\r
-cC 189.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5058ROAD 19T 325561.6 4700804.1 Sat Jun 02 00:18:14 2001 ROAD CROSSING ^ 18^Black ^S+N^0\r
-cA 5058ROAD|||||\r
-cB |||0|0|1.0e25\r
-cC 177.000001|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5150TANK 19T 325504.6 4700998.2 Sat Jun 02 00:18:16 2001 WATER TANK ^ 8211^Black ^S+N^0\r
-cA 5150TANK|||||\r
-cB |||0|0|1.0e25\r
-cC 221.000006|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5142 19T 325480.4 4701240.7 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 5142|||||\r
-cB |||0|0|1.0e25\r
-cC 165.993197|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5144SUMMIT 19T 325418.6 4701403.9 Wed Nov 28 21:05:28 2001 ^ 8246^Black ^S+N^0\r
-cA 5144SUMMIT|||||\r
-cB |||0|0|1.0e25\r
-cC 202.263459|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5156 19T 325538.9 4701616.4 Sat Jun 02 03:26:58 2001 ^ 18^Black ^S+N^0\r
-cA 5156|||||\r
-cB |||0|0|1.0e25\r
-cC 418.999990|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5148NANEPA 19T 325474.0 4701892.1 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA 5148NANEPA|||||\r
-cB |||0|0|1.0e25\r
-cC 393.074416|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5258 19T 325525.9 4702077.2 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA 5258|||||\r
-cB |||0|0|1.0e25\r
-cC 244.840687|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5252PURPLE 19T 325574.9 4702277.5 Wed Nov 07 23:53:41 2001 ^ 8246^Black ^S+N^0\r
-cA 5252PURPLE|||||\r
-cB |||0|0|1.0e25\r
-cC 255.879480|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 527631 19T 325735.7 4702606.4 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA 527631|||||\r
-cB |||0|0|1.0e25\r
-cC 258.245193|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 527614 19T 325710.4 4702644.8 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA 527614|||||\r
-cB |||0|0|1.0e25\r
-cC 258.245193|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5267OBSTAC 19T 325698.7 4702733.5 Sat Jun 02 03:27:00 2001 ^ 8204^Black ^S+N^0\r
-cA 5267OBSTAC|||||\r
-cB |||0|0|1.0e25\r
-cC 241.999989|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5278 19T 325759.2 4702816.5 Sat Jun 02 03:27:00 2001 ^ 18^Black ^S+N^0\r
-cA 5278|||||\r
-cB |||0|0|1.0e25\r
-cC 224.000000|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5289 19T 325881.1 4702950.0 Sat Jun 02 03:27:01 2001 ^ 18^Black ^S+N^0\r
-cA 5289|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5374FIRE 19T 325718.9 4703488.0 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 5374FIRE|||||\r
-cB |||0|0|1.0e25\r
-cC 173.877706|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5376 19T 325758.3 4703650.1 Sat Jun 02 03:27:02 2001 ^ 18^Black ^S+N^0\r
-cA 5376|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 5376STREAM 19T 325764.8 4703679.1 Wed Nov 07 23:53:41 2001 ^ 8233^Black ^S+N^0\r
-cA 5376STREAM|||||\r
-cB |||0|0|1.0e25\r
-cC 211.724709|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6328 19T 326241.2 4703800.2 Sat Jun 02 03:27:02 2001 ^ 18^Black ^S+N^0\r
-cA 6328|||||\r
-cB |||0|0|1.0e25\r
-cC 175.999994|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 635722 19T 326527.7 4703720.8 Sat Jun 02 03:27:02 2001 ^ 18^Black ^S+N^0\r
-cA 635722|||||\r
-cB |||0|0|1.0e25\r
-cC 160.000005|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 635783 19T 326582.0 4703730.3 Sat Jun 02 03:27:02 2001 ^ 18^Black ^S+N^0\r
-cA 635783|||||\r
-cB |||0|0|1.0e25\r
-cC 160.999999|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6373 19T 326762.1 4703385.6 Sat Jun 02 03:27:03 2001 ^ 18^Black ^S+N^0\r
-cA 6373|||||\r
-cB |||0|0|1.0e25\r
-cC 205.000004|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W BEAR HILL 19T 326748.2 4703629.5 Sat Jun 02 03:27:03 2001 BEAR HILL TOWER ^16391^Black ^S+N^0\r
-cA BEAR HILL|||||\r
-cB |||0|0|1.0e25\r
-cC 288.000007|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6289 19T 326830.3 4702994.0 Fri Nov 16 23:03:38 2001 ^ 18^Black ^S+N^0\r
-cA 6289|||||\r
-cB |||0|0|1.0e25\r
-cC 239.321491|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6297 19T 326910.4 4702728.7 Sat Jun 02 03:27:04 2001 ^ 18^Black ^S+N^0\r
-cA 6297|||||\r
-cB |||0|0|1.0e25\r
-cC 238.999995|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6283 19T 326892.6 4702310.1 Fri Nov 16 23:03:38 2001 ^ 18^Black ^S+N^0\r
-cA 6283|||||\r
-cB |||0|0|1.0e25\r
-cC 218.821047|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6280 19T 326869.0 4702042.4 Fri Nov 16 23:03:38 2001 ^ 18^Black ^S+N^0\r
-cA 6280|||||\r
-cB |||0|0|1.0e25\r
-cC 188.858953|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6177 19T 326799.5 4701712.8 Sat Jun 02 03:27:04 2001 ^ 18^Black ^S+N^0\r
-cA 6177|||||\r
-cB |||0|0|1.0e25\r
-cC 203.999997|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6176 19T 326759.4 4701642.2 Sat Jun 02 03:27:04 2001 ^ 18^Black ^S+N^0\r
-cA 6176|||||\r
-cB |||0|0|1.0e25\r
-cC 205.000004|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6153 19T 326565.3 4701310.2 Sat Jun 02 03:27:05 2001 ^ 18^Black ^S+N^0\r
-cA 6153|||||\r
-cB |||0|0|1.0e25\r
-cC 205.999998|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6171 19T 326774.3 4701173.8 Sat Jun 02 03:27:05 2001 ^ 18^Black ^S+N^0\r
-cA 6171|||||\r
-cB |||0|0|1.0e25\r
-cC 181.999995|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6131 19T 326349.9 4701116.5 Sat Jun 02 03:26:58 2001 ^ 18^Black ^S+N^0\r
-cA 6131|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6130 19T 326386.1 4701028.3 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 6130|||||\r
-cB |||0|0|1.0e25\r
-cC 210.000011|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6029 19T 326200.2 4700983.9 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 6029|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6006 19T 326091.0 4700682.6 Sat Jun 02 03:26:55 2001 ^ 18^Black ^S+N^0\r
-cA 6006|||||\r
-cB |||0|0|1.0e25\r
-cC 185.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W 6014MEADOW 19T 326186.1 4700429.0 Wed Nov 28 21:05:28 2001 ^ 18^Black ^S+N^0\r
-cA 6014MEADOW|||||\r
-cB |||0|0|1.0e25\r
-cC 123.415169|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W PANTHRCAVE 19T 326451.1 4700224.9 Wed Nov 07 23:53:41 2001 ^ 8243^Black ^S+N^0\r
-cA PANTHRCAVE|||||\r
-cB |||0|0|1.0e25\r
-cC 148.646638|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W GATE6 19T 326498.9 4699808.2 Wed Nov 07 23:53:41 2001 ^ 18^Black ^S+N^0\r
-cA GATE6|||||\r
-cB |||0|0|1.0e25\r
-cC 87.145307|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-W BELLEVUE 19T 326630.3 4699772.7 Sat Jun 02 00:18:15 2001 BELLEVUE ^ 158^Black ^S+N^0\r
-cA BELLEVUE|||||\r
-cB |||0|0|1.0e25\r
-cC 77.000002|1e25|FF|00|00|00|00|00|00|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF|FF\r
-cD 1.0e25|1.0e25|0\r
-\r
-E 01\r
cambridge dat Cambridge/Winpilot glider software
v900 Columbus/Visiontac V900 files (.csv)
csv Comma separated values
-compegps CompeGPS data files (.wpt/.trk/.rte)
iblue747 csv Data Logger iBlue747 csv
iblue757 csv Data Logger iBlue757 csv
gpl gpl DeLorme GPL
flysight csv FlySight GPS File
gpssim gpssim Franson GPSGate Simulation
fugawi txt Fugawi
-g7towin g7t G7ToWin data files (.g7t)
garmin301 Garmin 301 Custom position and heartrate
garmin_g1000 csv Garmin G1000 datalog input filter file
glogbook xml Garmin Logbook XML
gdb gdb Garmin MapSource - gdb
garmin_txt txt Garmin MapSource - txt (tab delimited)
-pcx pcx Garmin PCX5
garmin_poi Garmin POI database
garmin_gpi gpi Garmin Points of Interest (.gpi)
garmin Garmin serial/USB protocol
googledir xml Google Directions XML
kml kml Google Earth (Keyhole) Markup Language
gnav_trl trl Google Navigator Tracklines (.trl)
-gopal trk GoPal GPS track log (.trk)
land_air_sea txt GPS Tracking Key Pro text
gtm gtm GPS TrackMaker
arc txt GPSBabel arc filter file
gpsdrive GpsDrive Format
gpsdrivetrack GpsDrive Format for Tracks
-gpsman GPSman
-gpsutil gpsutil
gpx gpx GPX XML
hiketech gps HikeTech
holux wpo Holux (gm-100) .wpo Format
m241-bin bin Holux M-241 (MTK based) Binary File Format
m241 Holux M-241 (MTK based) download
-vpl Honda/Acura Navigation System VP Log File Format
html html HTML Output
humminbird_ht ht Humminbird tracks (.ht)
humminbird hwr Humminbird waypoints and routes (.hwr)
igoprimo_poi upoi iGo Primo points of interest (.upoi)
igo2008_poi upoi iGO2008 points of interest (.upoi)
igo8 trk IGO8 .trk
-jtr jtr Jelbert GeoTagger data file
-jogmap xml Jogmap.de XML format
kompass_tk wp Kompass (DAV) Track (.tk)
kompass_wp wp Kompass (DAV) Waypoints (.wp)
lowranceusr usr Lowrance USR
-maggeo gs Magellan Explorist Geocaching
-mapsend Magellan Mapsend
magellanx upt Magellan SD files (as for eXplorist)
magellan Magellan SD files (as for Meridian)
magellan Magellan serial protocol
tpo2 tpo National Geographic Topo 2.x .tpo
tpo3 tpo National Geographic Topo 3.x/4.x .tpo
navicache Navicache.com XML
-nmn4 rte Navigon Mobile Navigator .rte files
navigonwpt Navigon Waypoints
navilink NaviGPS GT-11/BGT-11 Download
sbp sbp NaviGPS GT-31/BGT-31 datalogger (.sbp)
lmx Nokia Landmark Exchange
osm osm OpenStreetMap data files
ozi OziExplorer
-pocketfms_bc PocketFMS breadcrumbs
-pocketfms_fp xml PocketFMS flightplan (.xml)
-pocketfms_wp txt PocketFMS waypoints (.txt)
qstarz_bl-1000 Qstarz BL-1000
raymarine rwf Raymarine Waypoint File (.rwf)
ricoh log Ricoh GPS Log File
cup cup See You flight analysis data
-skyforce Skymap / KMD150 ascii files
skytraq SkyTraq Venus based loggers (download)
skytraq-bin bin SkyTraq Venus based loggers Binary File Format
subrip srt SubRip subtitles for video mapping (.srt)
-stmsdf sdf Suunto Trek Manager (STM) .sdf files
-stmwpp txt Suunto Trek Manager (STM) WaypointPlus files
xol xol Swiss Map 25/50/100 (.xol)
openoffice Tab delimited fields useful for OpenOffice
teletype Teletype [ Get Jonathon Johnson to describe
tomtom_asc asc TomTom POI file (.asc)
tomtom ov2 TomTom POI file (.ov2)
dmtlog trl TrackLogs digital mapping (.trl)
-tiger U.S. Census Bureau Tiger Mapping Service
unicsv Universal csv with field structure in first line
vcard vcf Vcard Output (for iPod)
-vidaone gpb VidaOne GPS for Pocket PC (.gpb)
-vitosmt smt Vito Navigator II tracks
-vitovtt vtt Vito SmartMap tracks (.vtt)
-wfff xml WiFiFoFum 2.0 for PocketPC XML
wintec_tes tes Wintec TES file
wbt-bin bin Wintec WBT-100/200 Binary File Format
wbt Wintec WBT-100/200 GPS Download
wbt-tk1 tk1 Wintec WBT-201/G-Rays 2 Binary File Format
itracku XAiOX iTrackU Logger
itracku-bin bin XAiOX iTrackU Logger Binary File Format
-yahoo Yahoo Geocode API data
file cambridge dat Cambridge/Winpilot glider software
file v900 Columbus/Visiontac V900 files (.csv)
file csv Comma separated values
-file compegps CompeGPS data files (.wpt/.trk/.rte)
internal custom Custom "Everything" Style
file iblue747 csv Data Logger iBlue747 csv
file iblue757 csv Data Logger iBlue757 csv
file flysight csv FlySight GPS File
file gpssim gpssim Franson GPSGate Simulation
file fugawi txt Fugawi
-file g7towin g7t G7ToWin data files (.g7t)
file garmin301 Garmin 301 Custom position and heartrate
file garmin_g1000 csv Garmin G1000 datalog input filter file
file glogbook xml Garmin Logbook XML
file gdb gdb Garmin MapSource - gdb
file garmin_txt txt Garmin MapSource - txt (tab delimited)
-file pcx pcx Garmin PCX5
file garmin_poi Garmin POI database
file garmin_gpi gpi Garmin Points of Interest (.gpi)
serial garmin Garmin serial/USB protocol
file googledir xml Google Directions XML
file kml kml Google Earth (Keyhole) Markup Language
file gnav_trl trl Google Navigator Tracklines (.trl)
-file gopal trk GoPal GPS track log (.trk)
file land_air_sea txt GPS Tracking Key Pro text
file gtm gtm GPS TrackMaker
file arc txt GPSBabel arc filter file
file gpsdrive GpsDrive Format
file gpsdrivetrack GpsDrive Format for Tracks
-file gpsman GPSman
-file gpsutil gpsutil
file gpx gpx GPX XML
file hiketech gps HikeTech
file holux wpo Holux (gm-100) .wpo Format
file m241-bin bin Holux M-241 (MTK based) Binary File Format
serial m241 Holux M-241 (MTK based) download
-file vpl Honda/Acura Navigation System VP Log File Format
file html html HTML Output
file humminbird_ht ht Humminbird tracks (.ht)
file humminbird hwr Humminbird waypoints and routes (.hwr)
file igo2008_poi upoi iGO2008 points of interest (.upoi)
file igo8 trk IGO8 .trk
internal random Internal GPS data generator
-file jtr jtr Jelbert GeoTagger data file
-file jogmap xml Jogmap.de XML format
file kompass_tk wp Kompass (DAV) Track (.tk)
file kompass_wp wp Kompass (DAV) Waypoints (.wp)
file lowranceusr usr Lowrance USR
-file maggeo gs Magellan Explorist Geocaching
-file mapsend Magellan Mapsend
file magellanx upt Magellan SD files (as for eXplorist)
file magellan Magellan SD files (as for Meridian)
serial magellan Magellan serial protocol
file tpo2 tpo National Geographic Topo 2.x .tpo
file tpo3 tpo National Geographic Topo 3.x/4.x .tpo
file navicache Navicache.com XML
-file nmn4 rte Navigon Mobile Navigator .rte files
file navigonwpt Navigon Waypoints
serial navilink NaviGPS GT-11/BGT-11 Download
file sbp sbp NaviGPS GT-31/BGT-31 datalogger (.sbp)
file lmx Nokia Landmark Exchange
file osm osm OpenStreetMap data files
file ozi OziExplorer
-file pocketfms_bc PocketFMS breadcrumbs
-file pocketfms_fp xml PocketFMS flightplan (.xml)
-file pocketfms_wp txt PocketFMS waypoints (.txt)
file qstarz_bl-1000 Qstarz BL-1000
file raymarine rwf Raymarine Waypoint File (.rwf)
file ricoh log Ricoh GPS Log File
file cup cup See You flight analysis data
-file skyforce Skymap / KMD150 ascii files
serial skytraq SkyTraq Venus based loggers (download)
file skytraq-bin bin SkyTraq Venus based loggers Binary File Format
file subrip srt SubRip subtitles for video mapping (.srt)
-file stmsdf sdf Suunto Trek Manager (STM) .sdf files
-file stmwpp txt Suunto Trek Manager (STM) WaypointPlus files
file xol xol Swiss Map 25/50/100 (.xol)
file openoffice Tab delimited fields useful for OpenOffice
file teletype Teletype [ Get Jonathon Johnson to describe
file tomtom_asc asc TomTom POI file (.asc)
file tomtom ov2 TomTom POI file (.ov2)
file dmtlog trl TrackLogs digital mapping (.trl)
-file tiger U.S. Census Bureau Tiger Mapping Service
file unicsv Universal csv with field structure in first line
file vcard vcf Vcard Output (for iPod)
-file vidaone gpb VidaOne GPS for Pocket PC (.gpb)
-file vitosmt smt Vito Navigator II tracks
-file vitovtt vtt Vito SmartMap tracks (.vtt)
-file wfff xml WiFiFoFum 2.0 for PocketPC XML
file wintec_tes tes Wintec TES file
file wbt-bin bin Wintec WBT-100/200 Binary File Format
serial wbt Wintec WBT-100/200 GPS Download
file wbt-tk1 tk1 Wintec WBT-201/G-Rays 2 Binary File Format
serial itracku XAiOX iTrackU Logger
file itracku-bin bin XAiOX iTrackU Logger Binary File Format
-file yahoo Yahoo Geocode API data
file rw---- cambridge dat Cambridge/Winpilot glider software
file r-r--- v900 Columbus/Visiontac V900 files (.csv)
file rw---- csv Comma separated values
-file rwrwrw compegps CompeGPS data files (.wpt/.trk/.rte)
internal rw---- custom Custom "Everything" Style
file --rw-- iblue747 csv Data Logger iBlue747 csv
file --rw-- iblue757 csv Data Logger iBlue757 csv
file rw---- flysight csv FlySight GPS File
file -w-w-w gpssim gpssim Franson GPSGate Simulation
file rw---- fugawi txt Fugawi
-file r-r-r- g7towin g7t G7ToWin data files (.g7t)
file rw---- garmin301 Garmin 301 Custom position and heartrate
file --rw-- garmin_g1000 csv Garmin G1000 datalog input filter file
file --rw-- glogbook xml Garmin Logbook XML
file rwrwrw gdb gdb Garmin MapSource - gdb
file rwrwrw garmin_txt txt Garmin MapSource - txt (tab delimited)
-file rwrwrw pcx pcx Garmin PCX5
file rw---- garmin_poi Garmin POI database
file rw---- garmin_gpi gpi Garmin Points of Interest (.gpi)
serial rwrwrw garmin Garmin serial/USB protocol
file --r--- googledir xml Google Directions XML
file rwrwrw kml kml Google Earth (Keyhole) Markup Language
file --rw-- gnav_trl trl Google Navigator Tracklines (.trl)
-file --rw-- gopal trk GoPal GPS track log (.trk)
file --rw-- land_air_sea txt GPS Tracking Key Pro text
file rwrwrw gtm gtm GPS TrackMaker
file rw---- arc txt GPSBabel arc filter file
file rw---- gpsdrive GpsDrive Format
file rw---- gpsdrivetrack GpsDrive Format for Tracks
-file rw---- gpsman GPSman
-file rw---- gpsutil gpsutil
file rwrwrw gpx gpx GPX XML
file rwrw-- hiketech gps HikeTech
file rw---- holux wpo Holux (gm-100) .wpo Format
file r-r--- m241-bin bin Holux M-241 (MTK based) Binary File Format
serial --r--- m241 Holux M-241 (MTK based) download
-file --r--- vpl Honda/Acura Navigation System VP Log File Format
file -w---- html html HTML Output
file r-rwr- humminbird_ht ht Humminbird tracks (.ht)
file rwr-rw humminbird hwr Humminbird waypoints and routes (.hwr)
file rw---- igo2008_poi upoi iGO2008 points of interest (.upoi)
file --rw-- igo8 trk IGO8 .trk
internal r-r-r- random Internal GPS data generator
-file --rw-- jtr jtr Jelbert GeoTagger data file
-file --r--- jogmap xml Jogmap.de XML format
file --rw-- kompass_tk wp Kompass (DAV) Track (.tk)
file rw---- kompass_wp wp Kompass (DAV) Waypoints (.wp)
file rwrwrw lowranceusr usr Lowrance USR
-file rw---- maggeo gs Magellan Explorist Geocaching
-file rwrwrw mapsend Magellan Mapsend
file rwrwrw magellanx upt Magellan SD files (as for eXplorist)
file rwrwrw magellan Magellan SD files (as for Meridian)
serial rwrwrw magellan Magellan serial protocol
file --r--- tpo2 tpo National Geographic Topo 2.x .tpo
file r-r-r- tpo3 tpo National Geographic Topo 3.x/4.x .tpo
file r----- navicache Navicache.com XML
-file ----rw nmn4 rte Navigon Mobile Navigator .rte files
file rw---- navigonwpt Navigon Waypoints
serial rwrwrw navilink NaviGPS GT-11/BGT-11 Download
file --r--- sbp sbp NaviGPS GT-31/BGT-31 datalogger (.sbp)
file rw---- lmx Nokia Landmark Exchange
file rw-wrw osm osm OpenStreetMap data files
file rwrwrw ozi OziExplorer
-file --rw-- pocketfms_bc PocketFMS breadcrumbs
-file r---r- pocketfms_fp xml PocketFMS flightplan (.xml)
-file rw---- pocketfms_wp txt PocketFMS waypoints (.txt)
file r-r--- qstarz_bl-1000 Qstarz BL-1000
file rw--rw raymarine rwf Raymarine Waypoint File (.rwf)
file --rw-- ricoh log Ricoh GPS Log File
file rw---- cup cup See You flight analysis data
-file rwrwrw skyforce Skymap / KMD150 ascii files
serial r-r--- skytraq SkyTraq Venus based loggers (download)
file r-r--- skytraq-bin bin SkyTraq Venus based loggers Binary File Format
file ---w-- subrip srt SubRip subtitles for video mapping (.srt)
-file --rwrw stmsdf sdf Suunto Trek Manager (STM) .sdf files
-file rwrwrw stmwpp txt Suunto Trek Manager (STM) WaypointPlus files
file rwrw-- xol xol Swiss Map 25/50/100 (.xol)
file rw---- openoffice Tab delimited fields useful for OpenOffice
file r----- teletype Teletype [ Get Jonathon Johnson to describe
file rw---- tomtom_asc asc TomTom POI file (.asc)
file rw---- tomtom ov2 TomTom POI file (.ov2)
file rwrw-- dmtlog trl TrackLogs digital mapping (.trl)
-file rw---- tiger U.S. Census Bureau Tiger Mapping Service
file rwrwrw unicsv Universal csv with field structure in first line
file -w---- vcard vcf Vcard Output (for iPod)
-file --rw-- vidaone gpb VidaOne GPS for Pocket PC (.gpb)
-file rwrwrw vitosmt smt Vito Navigator II tracks
-file --r--- vitovtt vtt Vito SmartMap tracks (.vtt)
-file r----- wfff xml WiFiFoFum 2.0 for PocketPC XML
file r-r--- wintec_tes tes Wintec TES file
file --r--- wbt-bin bin Wintec WBT-100/200 Binary File Format
serial r-r--- wbt Wintec WBT-100/200 GPS Download
file --r--- wbt-tk1 tk1 Wintec WBT-201/G-Rays 2 Binary File Format
serial r-r--- itracku XAiOX iTrackU Logger
file rwrw-- itracku-bin bin XAiOX iTrackU Logger Binary File Format
-file r----- yahoo Yahoo Geocode API data
option csv datum GPS datum (def. WGS 84) string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_csv.html#fmt_csv_o_datum
-file rwrwrw compegps CompeGPS data files (.wpt/.trk/.rte) compegps
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_compegps.html
-option compegps deficon Default icon name string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_compegps.html#fmt_compegps_o_deficon
-
-option compegps index Index of route/track to write (if more than one in source) integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_compegps.html#fmt_compegps_o_index
-
-option compegps radius Give points (waypoints/route points) a default radius (proximity) float 0 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_compegps.html#fmt_compegps_o_radius
-
-option compegps snlen Length of generated shortnames (default 16) integer 16 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_compegps.html#fmt_compegps_o_snlen
-
internal rw---- custom Custom "Everything" Style xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_custom.html
option custom snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_custom.html#fmt_custom_o_snlen
option fugawi datum GPS datum (def. WGS 84) string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_fugawi.html#fmt_fugawi_o_datum
-file r-r-r- g7towin g7t G7ToWin data files (.g7t) g7towin
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_g7towin.html
file rw---- garmin301 Garmin 301 Custom position and heartrate xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_garmin301.html
option garmin301 snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_garmin301.html#fmt_garmin301_o_snlen
option garmin_txt utc Write timestamps with offset x to UTC time integer -23 +23 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_garmin_txt.html#fmt_garmin_txt_o_utc
-file rwrwrw pcx pcx Garmin PCX5 pcx
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_pcx.html
-option pcx deficon Default icon name string Waypoint https://www.gpsbabel.org/WEB_DOC_DIR/fmt_pcx.html#fmt_pcx_o_deficon
-
-option pcx cartoexploreur Write tracks compatible with Carto Exploreur boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_pcx.html#fmt_pcx_o_cartoexploreur
-
file rw---- garmin_poi Garmin POI database xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_garmin_poi.html
option garmin_poi snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_garmin_poi.html#fmt_garmin_poi_o_snlen
file --rw-- gnav_trl trl Google Navigator Tracklines (.trl) gnav_trl
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gnav_trl.html
-file --rw-- gopal trk GoPal GPS track log (.trk) gopal
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gopal.html
-option gopal date Complete date-free tracks with given date (YYYYMMDD). integer https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gopal.html#fmt_gopal_o_date
-
-option gopal maxspeed The maximum speed (km/h) traveling from waypoint to waypoint. integer 200 1 1000 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gopal.html#fmt_gopal_o_maxspeed
-
-option gopal minspeed The minimum speed (km/h) traveling from waypoint to waypoint. Set >0 to remove duplicate waypoints integer 0 0 999 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gopal.html#fmt_gopal_o_minspeed
-
-option gopal clean Cleanup common errors in trackdata boolean 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gopal.html#fmt_gopal_o_clean
-
file --rw-- land_air_sea txt GPS Tracking Key Pro text xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_land_air_sea.html
option land_air_sea snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_land_air_sea.html#fmt_land_air_sea_o_snlen
option gpsdrivetrack datum GPS datum (def. WGS 84) string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsdrivetrack.html#fmt_gpsdrivetrack_o_datum
-file rw---- gpsman GPSman xcsv
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsman.html
-option gpsman snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsman.html#fmt_gpsman_o_snlen
-
-option gpsman snwhite Allow whitespace synth. shortnames boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsman.html#fmt_gpsman_o_snwhite
-
-option gpsman snupper UPPERCASE synth. shortnames boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsman.html#fmt_gpsman_o_snupper
-
-option gpsman snunique Make synth. shortnames unique boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsman.html#fmt_gpsman_o_snunique
-
-option gpsman urlbase Basename prepended to URL on output string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsman.html#fmt_gpsman_o_urlbase
-
-option gpsman prefer_shortnames Use shortname instead of description boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsman.html#fmt_gpsman_o_prefer_shortnames
-
-option gpsman datum GPS datum (def. WGS 84) string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsman.html#fmt_gpsman_o_datum
-
-file rw---- gpsutil gpsutil gpsutil
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpsutil.html
file rwrwrw gpx gpx GPX XML gpx
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpx.html
option gpx snlen Length of generated shortnames integer 32 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpx.html#fmt_gpx_o_snlen
option m241 block_size_kb Size of blocks in KB to request from device integer 1 1 64 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_m241.html#fmt_m241_o_block_size_kb
-file --r--- vpl Honda/Acura Navigation System VP Log File Format vpl
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vpl.html
file -w---- html html HTML Output html
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_html.html
option html stylesheet Path to HTML style sheet string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_html.html#fmt_html_o_stylesheet
option random nodelay Output realtime points without delay boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_random.html#fmt_random_o_nodelay
-file --rw-- jtr jtr Jelbert GeoTagger data file jtr
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_jtr.html
-file --r--- jogmap xml Jogmap.de XML format jogmap
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_jogmap.html
file --rw-- kompass_tk wp Kompass (DAV) Track (.tk) xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_kompass_tk.html
option kompass_tk snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_kompass_tk.html#fmt_kompass_tk_o_snlen
option lowranceusr description (USR output) Output file content description string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_lowranceusr.html#fmt_lowranceusr_o_description
-file rw---- maggeo gs Magellan Explorist Geocaching maggeo
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_maggeo.html
-file rwrwrw mapsend Magellan Mapsend mapsend
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_mapsend.html
-option mapsend trkver MapSend version TRK file to generate (3,4) integer 4 3 4 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_mapsend.html#fmt_mapsend_o_trkver
-
file rwrwrw magellanx upt Magellan SD files (as for eXplorist) magellanx
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_magellanx.html
option magellanx deficon Default icon name string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_magellanx.html#fmt_magellanx_o_deficon
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_navicache.html
option navicache noretired Suppress retired geocaches boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_navicache.html#fmt_navicache_o_noretired
-file ----rw nmn4 rte Navigon Mobile Navigator .rte files nmn4
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_nmn4.html
-option nmn4 index Index of route to write (if more than one in source) integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_nmn4.html#fmt_nmn4_o_index
-
file rw---- navigonwpt Navigon Waypoints xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_navigonwpt.html
option navigonwpt snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_navigonwpt.html#fmt_navigonwpt_o_snlen
option ozi codec codec to use for reading and writing strings (default windows-1252) string windows-1252 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_ozi.html#fmt_ozi_o_codec
-file --rw-- pocketfms_bc PocketFMS breadcrumbs pocketfms_bc
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_pocketfms_bc.html
-file r---r- pocketfms_fp xml PocketFMS flightplan (.xml) pocketfms_fp
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_pocketfms_fp.html
-file rw---- pocketfms_wp txt PocketFMS waypoints (.txt) pocketfms_wp
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_pocketfms_wp.html
file r-r--- qstarz_bl-1000 Qstarz BL-1000 qstarz_bl-1000
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_qstarz_bl-1000.html
file rw--rw raymarine rwf Raymarine Waypoint File (.rwf) raymarine
option cup datum GPS datum (def. WGS 84) string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_cup.html#fmt_cup_o_datum
-file rwrwrw skyforce Skymap / KMD150 ascii files skyforce
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_skyforce.html
serial r-r--- skytraq SkyTraq Venus based loggers (download) skytraq
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_skytraq.html
option skytraq erase Erase device data after download boolean 0 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_skytraq.html#fmt_skytraq_o_erase
option subrip format Format for subtitles string %s km/h %e m\n%t %l https://www.gpsbabel.org/WEB_DOC_DIR/fmt_subrip.html#fmt_subrip_o_format
-file --rwrw stmsdf sdf Suunto Trek Manager (STM) .sdf files stmsdf
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_stmsdf.html
-option stmsdf index Index of route (if more than one in source) integer 1 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_stmsdf.html#fmt_stmsdf_o_index
-
-file rwrwrw stmwpp txt Suunto Trek Manager (STM) WaypointPlus files stmwpp
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_stmwpp.html
-option stmwpp index Index of route/track to write (if more than one in source) integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_stmwpp.html#fmt_stmwpp_o_index
-
file rwrw-- xol xol Swiss Map 25/50/100 (.xol) xol
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_xol.html
file rw---- openoffice Tab delimited fields useful for OpenOffice xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_dmtlog.html
option dmtlog index Index of track (if more than one in source) integer 1 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_dmtlog.html#fmt_dmtlog_o_index
-file rw---- tiger U.S. Census Bureau Tiger Mapping Service tiger
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html
-option tiger nolabels Suppress labels on generated pins boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_nolabels
-
-option tiger genurl Generate file with lat/lon for centering map outfile https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_genurl
-
-option tiger margin Margin for map. Degrees or percentage float 15% https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_margin
-
-option tiger snlen Max shortname length when used with -s integer 10 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_snlen
-
-option tiger oldthresh Days after which points are considered old integer 14 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_oldthresh
-
-option tiger oldmarker Marker type for old points string redpin https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_oldmarker
-
-option tiger newmarker Marker type for new points string greenpin https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_newmarker
-
-option tiger suppresswhite Suppress whitespace in generated shortnames boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_suppresswhite
-
-option tiger unfoundmarker Marker type for unfound points string bluepin https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_unfoundmarker
-
-option tiger xpixels Width in pixels of map integer 768 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_xpixels
-
-option tiger ypixels Height in pixels of map integer 768 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_ypixels
-
-option tiger iconismarker The icon description is already the marker boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tiger.html#fmt_tiger_o_iconismarker
-
file rwrwrw unicsv Universal csv with field structure in first line unicsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_unicsv.html
option unicsv datum GPS datum (def. WGS 84) string WGS 84 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_unicsv.html#fmt_unicsv_o_datum
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vcard.html
option vcard encrypt Encrypt hints using ROT13 boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vcard.html#fmt_vcard_o_encrypt
-file --rw-- vidaone gpb VidaOne GPS for Pocket PC (.gpb) vidaone
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vidaone.html
-option vidaone ver Version of VidaOne file to read or write (1 or 2) integer 1 1 2 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vidaone.html#fmt_vidaone_o_ver
-
-file rwrwrw vitosmt smt Vito Navigator II tracks vitosmt
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vitosmt.html
-file --r--- vitovtt vtt Vito SmartMap tracks (.vtt) vitovtt
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vitovtt.html
-file r----- wfff xml WiFiFoFum 2.0 for PocketPC XML wfff
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wfff.html
-option wfff aicicon Infrastructure closed icon name string Red Square https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wfff.html#fmt_wfff_o_aicicon
-
-option wfff aioicon Infrastructure open icon name string Green Square https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wfff.html#fmt_wfff_o_aioicon
-
-option wfff ahcicon Ad-hoc closed icon name string Red Diamond https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wfff.html#fmt_wfff_o_ahcicon
-
-option wfff ahoicon Ad-hoc open icon name string Green Diamond https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wfff.html#fmt_wfff_o_ahoicon
-
-option wfff snmac Shortname is MAC address boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wfff.html#fmt_wfff_o_snmac
-
file r-r--- wintec_tes tes Wintec TES file wintec_tes
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wintec_tes.html
file --r--- wbt-bin bin Wintec WBT-100/200 Binary File Format wbt-bin
option itracku-bin new Only waypoints that are not the backup file string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_itracku-bin.html#fmt_itracku-bin_o_new
-file r----- yahoo Yahoo Geocode API data yahoo
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_yahoo.html
-option yahoo addrsep String to separate concatenated address fields (default=", ") string , https://www.gpsbabel.org/WEB_DOC_DIR/fmt_yahoo.html#fmt_yahoo_o_addrsep
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="50.307048000" minlon="8.231283000" maxlat="50.309623000" maxlon="8.232662000"/>
- <wpt lat="50.307048000" lon="8.232662000">
- <ele>341.950</ele>
- <time>2009-11-06T21:32:32.529Z</time>
- <name>RPT001</name>
- <cmt>RPT001</cmt>
- <desc>RPT001</desc>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </wpt>
- <wpt lat="50.307475000" lon="8.232442000">
- <ele>341.990</ele>
- <time>2009-11-06T21:32:33.530Z</time>
- <name>RPT002</name>
- <cmt>RPT002</cmt>
- <desc>RPT002</desc>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </wpt>
- <wpt lat="50.307902000" lon="8.232223000">
- <ele>341.813</ele>
- <time>2009-11-06T21:32:34.531Z</time>
- <name>RPT003</name>
- <cmt>RPT003</cmt>
- <desc>RPT003</desc>
- <fix>2d</fix>
- <sat>10</sat>
- <hdop>0.832000</hdop>
- </wpt>
- <wpt lat="50.308332000" lon="8.232000000">
- <ele>341.493</ele>
- <time>2009-11-06T21:32:35.532Z</time>
- <name>RPT004</name>
- <cmt>RPT004</cmt>
- <desc>RPT004</desc>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </wpt>
- <wpt lat="50.308765000" lon="8.231770000">
- <ele>341.150</ele>
- <time>2009-11-06T21:32:36.533Z</time>
- <name>RPT005</name>
- <cmt>RPT005</cmt>
- <desc>RPT005</desc>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </wpt>
- <wpt lat="50.309198000" lon="8.231532000">
- <ele>340.210</ele>
- <time>2009-11-06T21:32:37.534Z</time>
- <name>RPT006</name>
- <cmt>RPT006</cmt>
- <desc>RPT006</desc>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </wpt>
- <wpt lat="50.309623000" lon="8.231283000">
- <ele>339.163</ele>
- <time>2009-11-06T21:32:38.535Z</time>
- <name>RPT007</name>
- <cmt>RPT007</cmt>
- <desc>RPT007</desc>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </wpt>
- <rte>
- <name>Tracklog 1970-01-01T00:00:00Z</name>
- <rtept lat="50.307048000" lon="8.232662000">
- <ele>341.950</ele>
- <time>2009-11-06T21:32:32.529Z</time>
- <name>RPT001</name>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </rtept>
- <rtept lat="50.307475000" lon="8.232442000">
- <ele>341.990</ele>
- <time>2009-11-06T21:32:33.530Z</time>
- <name>RPT002</name>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </rtept>
- <rtept lat="50.307902000" lon="8.232223000">
- <ele>341.813</ele>
- <time>2009-11-06T21:32:34.531Z</time>
- <name>RPT003</name>
- <fix>2d</fix>
- <sat>10</sat>
- <hdop>0.832000</hdop>
- </rtept>
- <rtept lat="50.308332000" lon="8.232000000">
- <ele>341.493</ele>
- <time>2009-11-06T21:32:35.532Z</time>
- <name>RPT004</name>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </rtept>
- <rtept lat="50.308765000" lon="8.231770000">
- <ele>341.150</ele>
- <time>2009-11-06T21:32:36.533Z</time>
- <name>RPT005</name>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </rtept>
- <rtept lat="50.309198000" lon="8.231532000">
- <ele>340.210</ele>
- <time>2009-11-06T21:32:37.534Z</time>
- <name>RPT006</name>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </rtept>
- <rtept lat="50.309623000" lon="8.231283000">
- <ele>339.163</ele>
- <time>2009-11-06T21:32:38.535Z</time>
- <name>RPT007</name>
- <fix>2d</fix>
- <sat>11</sat>
- <hdop>0.766000</hdop>
- </rtept>
- </rte>
-</gpx>
+++ /dev/null
-38528677, 213232, 8.232662, 50.307048, 341.95, 180.227, 2, 0.766000, 11, 20091106, 0, 300
-38529696, 213233, 8.232442, 50.307475, 341.99, 179.174, 2, 0.766000, 11, 20091106, 0, 298
-38530720, 213234, 8.232223, 50.307902, 341.813, 179.203, 2, 0.832000, 10, 20091106, 0, 297
-38531752, 213235, 8.232000, 50.308332, 341.493, 181.152, 2, 0.766000, 11, 20091106, 0, 295
-38532669, 213236, 8.231770, 50.308765, 341.15, 183.765, 2, 0.766000, 11, 20091106, 0, 293
-38533696, 213237, 8.231532, 50.309198, 340.21, 183.95, 2, 0.766000, 11, 20091106, 0, 292
-38534714, 213238, 8.231283, 50.309623, 339.163, 178.342, 2, 0.766000, 11, 20091106, 0, 291
+++ /dev/null
-H SOFTWARE NAME & VERSION
-I GPSU 4.20 01 REGISTERED to 'THIS FILE CREATED BY HAND FOR GPSBABEL TEST'
-S DateFormat=dd/mm/yyyy
-S Timezone=+01:00
-S Units=N,M
-S SymbolSet=0
-
-H R DATUM
-M E WGS 84 100 0.0000000E+00 0.0000000E+00 0 0 0
-
-H COORDINATE SYSTEM
-U LAT LON DM
-
-F ID---- Latitude Longitude T O Comment
-W GCEBB N35°58.3220' W087°08.0820' I E Mountain Bike Heaven by susy1313
-W GC1A37 N36°05.4410' W086°40.7730' I E The Troll by a182pilot & Family
-W GC1C2B N35°59.7760' W086°37.2070' I E Dive Bomber by JoGPS & family
-W GC25A9 N36°02.3090' W086°38.9170' I E FOSTER by JoGPS & Family
-W GC2723 N36°06.7310' W086°44.5060' I E Logan Lighthouse by JoGps & Family
-W GC2B71 N36°03.8450' W086°47.4310' I E Ganier Cache by Susy1313
-W GC309F N36°05.2660' W086°48.5840' I E Shy's Hill by FireFighterEng33
-W GC317A N36°03.4500' W086°53.5200' I E GittyUp by JoGPS / Warner Parks
-W GC317D N36°04.9680' W086°52.0370' I E Inlighting by JoGPS / Warner Parks
urlbase Basename prepended to URL on output
prefer_shortnames (0/1) Use shortname instead of description
datum GPS datum (def. WGS 84)
- compegps CompeGPS data files (.wpt/.trk/.rte)
- deficon Default icon name
- index Index of route/track to write (if more than one in
- radius Give points (waypoints/route points) a default rad
- snlen Length of generated shortnames (default 16)
iblue747 Data Logger iBlue747 csv
snlen Max synthesized shortname length
snwhite (0/1) Allow whitespace synth. shortnames
urlbase Basename prepended to URL on output
prefer_shortnames (0/1) Use shortname instead of description
datum GPS datum (def. WGS 84)
- g7towin G7ToWin data files (.g7t)
garmin301 Garmin 301 Custom position and heartrate
snlen Max synthesized shortname length
snwhite (0/1) Allow whitespace synth. shortnames
temp Temperature unit [c=Celsius, f=Fahrenheit]
time Read/Write time format (i.e. HH:mm:ss xx)
utc Write timestamps with offset x to UTC time
- pcx Garmin PCX5
- deficon Default icon name
- cartoexploreur (0/1) Write tracks compatible with Carto Exploreur
garmin_poi Garmin POI database
snlen Max synthesized shortname length
snwhite (0/1) Allow whitespace synth. shortnames
rotate_colors Rotate colors for tracks and routes (default autom
prec Precision of coordinates, number of decimals
gnav_trl Google Navigator Tracklines (.trl)
- gopal GoPal GPS track log (.trk)
- date Complete date-free tracks with given date (YYYYMMD
- maxspeed The maximum speed (km/h) traveling from waypoint t
- minspeed The minimum speed (km/h) traveling from waypoint t
- clean (0/1) Cleanup common errors in trackdata
land_air_sea GPS Tracking Key Pro text
snlen Max synthesized shortname length
snwhite (0/1) Allow whitespace synth. shortnames
urlbase Basename prepended to URL on output
prefer_shortnames (0/1) Use shortname instead of description
datum GPS datum (def. WGS 84)
- gpsman GPSman
- snlen Max synthesized shortname length
- snwhite (0/1) Allow whitespace synth. shortnames
- snupper (0/1) UPPERCASE synth. shortnames
- snunique (0/1) Make synth. shortnames unique
- urlbase Basename prepended to URL on output
- prefer_shortnames (0/1) Use shortname instead of description
- datum GPS datum (def. WGS 84)
- gpsutil gpsutil
gpx GPX XML
snlen Length of generated shortnames
suppresswhite (0/1) No whitespace in generated shortnames
log_enable (0/1) Enable logging after download
csv MTK compatible CSV output file
block_size_kb Size of blocks in KB to request from device
- vpl Honda/Acura Navigation System VP Log File Format
html HTML Output
stylesheet Path to HTML style sheet
encrypt (0/1) Encrypt hints using ROT13
tracknum Track identification number
title Track title
description Track description
- jtr Jelbert GeoTagger data file
- jogmap Jogmap.de XML format
kompass_tk Kompass (DAV) Track (.tk)
snlen Max synthesized shortname length
snwhite (0/1) Allow whitespace synth. shortnames
title (USR output) Output file title string
serialnum (USR output) Device serial number
description (USR output) Output file content description
- maggeo Magellan Explorist Geocaching
- mapsend Magellan Mapsend
- trkver MapSend version TRK file to generate (3,4)
magellanx Magellan SD files (as for eXplorist)
deficon Default icon name
maxcmts Max number of comments to write (maxcmts=200)
tpo3 National Geographic Topo 3.x/4.x .tpo
navicache Navicache.com XML
noretired (0/1) Suppress retired geocaches
- nmn4 Navigon Mobile Navigator .rte files
- index Index of route to write (if more than one in sourc
navigonwpt Navigon Waypoints
snlen Max synthesized shortname length
snwhite (0/1) Allow whitespace synth. shortnames
altunit Unit used in altitude values
proxunit Unit used in proximity values
codec codec to use for reading and writing strings (defa
- pocketfms_bc PocketFMS breadcrumbs
- pocketfms_fp PocketFMS flightplan (.xml)
- pocketfms_wp PocketFMS waypoints (.txt)
qstarz_bl-1000 Qstarz BL-1000
raymarine Raymarine Waypoint File (.rwf)
location Default location
urlbase Basename prepended to URL on output
prefer_shortnames (0/1) Use shortname instead of description
datum GPS datum (def. WGS 84)
- skyforce Skymap / KMD150 ascii files
skytraq SkyTraq Venus based loggers (download)
erase (0/1) Erase device data after download
targetlocation Set location finder target location as lat,lng
gps_time GPS time at position video_time (hhmmss[.sss], def
gps_date GPS date at position video_time (yyyymmdd, default
format Format for subtitles
- stmsdf Suunto Trek Manager (STM) .sdf files
- index Index of route (if more than one in source)
- stmwpp Suunto Trek Manager (STM) WaypointPlus files
- index Index of route/track to write (if more than one in
xol Swiss Map 25/50/100 (.xol)
openoffice Tab delimited fields useful for OpenOffice
snlen Max synthesized shortname length
tomtom TomTom POI file (.ov2)
dmtlog TrackLogs digital mapping (.trl)
index Index of track (if more than one in source)
- tiger U.S. Census Bureau Tiger Mapping Service
- nolabels (0/1) Suppress labels on generated pins
- genurl Generate file with lat/lon for centering map
- margin Margin for map. Degrees or percentage
- snlen Max shortname length when used with -s
- oldthresh Days after which points are considered old
- oldmarker Marker type for old points
- newmarker Marker type for new points
- suppresswhite (0/1) Suppress whitespace in generated shortnames
- unfoundmarker Marker type for unfound points
- xpixels Width in pixels of map
- ypixels Height in pixels of map
- iconismarker (0/1) The icon description is already the marker
unicsv Universal csv with field structure in first line
datum GPS datum (def. WGS 84)
grid Write position using this grid.
codec codec to use for reading and writing strings (defa
vcard Vcard Output (for iPod)
encrypt (0/1) Encrypt hints using ROT13
- vidaone VidaOne GPS for Pocket PC (.gpb)
- ver Version of VidaOne file to read or write (1 or 2)
- vitosmt Vito Navigator II tracks
- vitovtt Vito SmartMap tracks (.vtt)
- wfff WiFiFoFum 2.0 for PocketPC XML
- aicicon Infrastructure closed icon name
- aioicon Infrastructure open icon name
- ahcicon Ad-hoc closed icon name
- ahoicon Ad-hoc open icon name
- snmac (0/1) Shortname is MAC address
wintec_tes Wintec TES file
wbt-bin Wintec WBT-100/200 Binary File Format
wbt Wintec WBT-100/200 GPS Download
itracku-bin XAiOX iTrackU Logger Binary File Format
backup Appends the input to a backup file
new Only waypoints that are not the backup file
- yahoo Yahoo Geocode API data
- addrsep String to separate concatenated address fields (de
Supported data filters:
arc Include Only Points Within Distance of Arc
+++ /dev/null
-Mountain 3558.322N 08708.081W 0000000m Mountain Bike Heaven by susy13 a
-The Trol 3605.441N 08640.772W 0000000m The Troll by a182pilot & Famil a
-Dive Bom 3559.776N 08637.207W 0000000m Dive Bomber by JoGPS & family a
-FOSTER b 3602.309N 08638.917W 0000000m FOSTER by JoGPS & Family a
-Logan Li 3606.731N 08644.506W 0000000m Logan Lighthouse by JoGps & Fa a
-Ganier C 3603.845N 08647.431W 0000000m Ganier Cache by Susy1313 a
-Shy's Hi 3605.266N 08648.583W 0000000m Shy's Hill by FireFighterEng33 a
-GittyUp 3603.450N 08653.519W 0000000m GittyUp by JoGPS / Warner Park a
-Inlighti 3604.968N 08652.036W 0000000m Inlighting by JoGPS / Warner P a
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="51.157424927" minlon="14.946011543" maxlat="51.170711517" maxlon="14.964761734"/>
- <trk>
- <name>PocketFMS</name>
- <desc>Breadcrumb</desc>
- <url>www.pocketfms.com</url>
- <number>1</number>
- <trkseg>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:51:57Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:51:58Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:51:59Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:00Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:01Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:03Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:04Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:05Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:06Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:07Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:08Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:10Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:11Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:12Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:13Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:14Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:15Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:16Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:17Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:18Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:20Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:21Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:22Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:23Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:24Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:25Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:26Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:27Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:28Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:29Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:31Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:32Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:33Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:34Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:35Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:36Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:37Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:38Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:40Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:41Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:42Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:43Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:44Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:46Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:47Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:48Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:49Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:50Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:51Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:52Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:53Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:55Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:56Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:57Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:58Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:52:59Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:00Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:01Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:03Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:04Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:05Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:06Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:07Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:08Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:10Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:11Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:12Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:13Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:14Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:15Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:16Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:17Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:18Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:20Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:21Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:22Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:23Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:24Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:25Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:26Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:27Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:28Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:29Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:30Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:31Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:32Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:33Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:35Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:36Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:37Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:38Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:39Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:40Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:41Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:42Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:43Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:45Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:46Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:47Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:48Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:49Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:50Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:52Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:53Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:54Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:56Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:57Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:58Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:53:59Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:00Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:01Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:02Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:03Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:05Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:06Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:07Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:08Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:09Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:10Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:11Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:12Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:13Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:15Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:16Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:17Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:18Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:20Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:21Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:22Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:23Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:25Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:26Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:27Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:28Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:29Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:31Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:32Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:33Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:34Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:35Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:36Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:37Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:38Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:40Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:41Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:42Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:43Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:45Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:46Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:47Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:48Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:50Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:51Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:52Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:53Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:54Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:55Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:56Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:57Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:58Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:54:59Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:01Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:02Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:03Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:04Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:05Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:06Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:08Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:09Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:10Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:11Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:12Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:13Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:14Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:16Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:17Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:18Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:19Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:20Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:21Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:22Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:23Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:25Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:26Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:27Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:28Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:29Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:30Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:31Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:32Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>-0.304800</ele>
- <time>2007-08-19T12:55:33Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160198212" lon="14.946299553">
- <ele>231.295203</ele>
- <time>2007-08-19T12:55:34Z</time>
- <fix>none</fix>
- </trkpt>
- <trkpt lat="51.160514832" lon="14.946450233">
- <ele>231.295203</ele>
- <time>2007-08-19T12:55:34Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160507202" lon="14.946461678">
- <ele>230.295208</ele>
- <time>2007-08-19T12:55:36Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160503387" lon="14.946471214">
- <ele>230.295208</ele>
- <time>2007-08-19T12:55:37Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160499573" lon="14.946484566">
- <ele>230.095202</ele>
- <time>2007-08-19T12:55:38Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160499573" lon="14.946484566">
- <ele>230.095202</ele>
- <time>2007-08-19T12:55:39Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160499573" lon="14.946484566">
- <ele>230.095202</ele>
- <time>2007-08-19T12:55:40Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160499573" lon="14.946484566">
- <ele>230.095202</ele>
- <time>2007-08-19T12:55:41Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160499573" lon="14.946484566">
- <ele>230.095202</ele>
- <time>2007-08-19T12:55:42Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160499573" lon="14.946484566">
- <ele>230.095202</ele>
- <time>2007-08-19T12:55:43Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160511017" lon="14.946571350">
- <ele>229.195201</ele>
- <time>2007-08-19T12:55:44Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160518646" lon="14.946591377">
- <ele>229.195201</ele>
- <time>2007-08-19T12:55:45Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160530090" lon="14.946611404">
- <ele>229.195201</ele>
- <time>2007-08-19T12:55:46Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160541534" lon="14.946633339">
- <ele>229.295195</ele>
- <time>2007-08-19T12:55:47Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160556793" lon="14.946656227">
- <ele>229.295195</ele>
- <time>2007-08-19T12:55:48Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160572052" lon="14.946680069">
- <ele>229.295195</ele>
- <time>2007-08-19T12:55:49Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160591125" lon="14.946704865">
- <ele>229.395207</ele>
- <time>2007-08-19T12:55:50Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160610199" lon="14.946735382">
- <ele>229.395207</ele>
- <time>2007-08-19T12:55:51Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160629272" lon="14.946766853">
- <ele>229.495201</ele>
- <time>2007-08-19T12:55:52Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160652161" lon="14.946800232">
- <ele>229.495201</ele>
- <time>2007-08-19T12:55:53Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160675049" lon="14.946833611">
- <ele>229.495201</ele>
- <time>2007-08-19T12:55:54Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160697937" lon="14.946865082">
- <ele>229.495201</ele>
- <time>2007-08-19T12:55:55Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160717010" lon="14.946896553">
- <ele>229.595195</ele>
- <time>2007-08-19T12:55:56Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160736084" lon="14.946923256">
- <ele>229.595195</ele>
- <time>2007-08-19T12:55:57Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160755157" lon="14.946947098">
- <ele>229.795201</ele>
- <time>2007-08-19T12:55:58Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160774231" lon="14.946969986">
- <ele>229.895195</ele>
- <time>2007-08-19T12:55:59Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160789490" lon="14.946991920">
- <ele>229.895195</ele>
- <time>2007-08-19T12:56:00Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160800934" lon="14.947014809">
- <ele>229.995208</ele>
- <time>2007-08-19T12:56:01Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160808563" lon="14.947039604">
- <ele>230.095202</ele>
- <time>2007-08-19T12:56:02Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160812378" lon="14.947066307">
- <ele>230.195196</ele>
- <time>2007-08-19T12:56:03Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160808563" lon="14.947090149">
- <ele>230.595208</ele>
- <time>2007-08-19T12:56:04Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160808563" lon="14.947114944">
- <ele>230.795196</ele>
- <time>2007-08-19T12:56:05Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160800934" lon="14.947139740">
- <ele>231.095197</ele>
- <time>2007-08-19T12:56:06Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160789490" lon="14.947166443">
- <ele>231.195209</ele>
- <time>2007-08-19T12:56:07Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160778046" lon="14.947195053">
- <ele>231.295203</ele>
- <time>2007-08-19T12:56:08Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160762787" lon="14.947224617">
- <ele>231.495191</ele>
- <time>2007-08-19T12:56:09Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160743713" lon="14.947259903">
- <ele>231.595203</ele>
- <time>2007-08-19T12:56:10Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160724640" lon="14.947299957">
- <ele>231.595203</ele>
- <time>2007-08-19T12:56:11Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160701752" lon="14.947342873">
- <ele>231.595203</ele>
- <time>2007-08-19T12:56:12Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160678864" lon="14.947389603">
- <ele>231.595203</ele>
- <time>2007-08-19T12:56:13Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160655975" lon="14.947440147">
- <ele>231.595203</ele>
- <time>2007-08-19T12:56:14Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160629272" lon="14.947493553">
- <ele>231.595203</ele>
- <time>2007-08-19T12:56:15Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160602570" lon="14.947551727">
- <ele>231.495191</ele>
- <time>2007-08-19T12:56:16Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160575867" lon="14.947609901">
- <ele>231.595203</ele>
- <time>2007-08-19T12:56:17Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160549164" lon="14.947669983">
- <ele>231.495191</ele>
- <time>2007-08-19T12:56:18Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160518646" lon="14.947731972">
- <ele>231.395197</ele>
- <time>2007-08-19T12:56:19Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160488129" lon="14.947790146">
- <ele>231.395197</ele>
- <time>2007-08-19T12:56:20Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160461426" lon="14.947856903">
- <ele>230.995203</ele>
- <time>2007-08-19T12:56:21Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160427094" lon="14.947923660">
- <ele>230.795196</ele>
- <time>2007-08-19T12:56:22Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160396576" lon="14.947991371">
- <ele>230.495196</ele>
- <time>2007-08-19T12:56:23Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160366058" lon="14.948056221">
- <ele>230.695202</ele>
- <time>2007-08-19T12:56:24Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160331726" lon="14.948124886">
- <ele>230.695202</ele>
- <time>2007-08-19T12:56:25Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160301208" lon="14.948195457">
- <ele>230.695202</ele>
- <time>2007-08-19T12:56:26Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160266876" lon="14.948258400">
- <ele>230.795196</ele>
- <time>2007-08-19T12:56:27Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160232544" lon="14.948318481">
- <ele>231.395197</ele>
- <time>2007-08-19T12:56:28Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160194397" lon="14.948385239">
- <ele>231.695197</ele>
- <time>2007-08-19T12:56:29Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160160065" lon="14.948452950">
- <ele>231.695197</ele>
- <time>2007-08-19T12:56:30Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160118103" lon="14.948525429">
- <ele>232.095191</ele>
- <time>2007-08-19T12:56:31Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160079956" lon="14.948597908">
- <ele>232.795204</ele>
- <time>2007-08-19T12:56:32Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160041809" lon="14.948670387">
- <ele>232.995192</ele>
- <time>2007-08-19T12:56:33Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160003662" lon="14.948742867">
- <ele>233.095205</ele>
- <time>2007-08-19T12:56:34Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159965515" lon="14.948815346">
- <ele>233.195199</ele>
- <time>2007-08-19T12:56:35Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159927368" lon="14.948888779">
- <ele>233.295192</ele>
- <time>2007-08-19T12:56:36Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159893036" lon="14.948963165">
- <ele>233.395205</ele>
- <time>2007-08-19T12:56:37Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159851074" lon="14.949043274">
- <ele>233.795199</ele>
- <time>2007-08-19T12:56:38Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159809113" lon="14.949125290">
- <ele>233.995206</ele>
- <time>2007-08-19T12:56:39Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159770966" lon="14.949208260">
- <ele>234.495194</ele>
- <time>2007-08-19T12:56:40Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159736633" lon="14.949290276">
- <ele>234.395200</ele>
- <time>2007-08-19T12:56:41Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159698486" lon="14.949366570">
- <ele>234.395200</ele>
- <time>2007-08-19T12:56:42Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159664154" lon="14.949440002">
- <ele>234.395200</ele>
- <time>2007-08-19T12:56:43Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159629822" lon="14.949508667">
- <ele>234.395200</ele>
- <time>2007-08-19T12:56:44Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159599304" lon="14.949566841">
- <ele>234.395200</ele>
- <time>2007-08-19T12:56:45Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159564972" lon="14.949620247">
- <ele>234.195193</ele>
- <time>2007-08-19T12:56:46Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159534454" lon="14.949667931">
- <ele>234.095199</ele>
- <time>2007-08-19T12:56:47Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159500122" lon="14.949709892">
- <ele>234.095199</ele>
- <time>2007-08-19T12:56:48Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159461975" lon="14.949748039">
- <ele>234.095199</ele>
- <time>2007-08-19T12:56:49Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159427643" lon="14.949780464">
- <ele>234.095199</ele>
- <time>2007-08-19T12:56:50Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159397125" lon="14.949805260">
- <ele>233.795199</ele>
- <time>2007-08-19T12:56:51Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159366608" lon="14.949823380">
- <ele>233.695205</ele>
- <time>2007-08-19T12:56:52Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159332275" lon="14.949831963">
- <ele>233.695205</ele>
- <time>2007-08-19T12:56:53Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159301758" lon="14.949832916">
- <ele>233.695205</ele>
- <time>2007-08-19T12:56:54Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159267426" lon="14.949823380">
- <ele>233.795199</ele>
- <time>2007-08-19T12:56:55Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159236908" lon="14.949803352">
- <ele>233.995206</ele>
- <time>2007-08-19T12:56:56Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159210205" lon="14.949771881">
- <ele>233.995206</ele>
- <time>2007-08-19T12:56:57Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159187317" lon="14.949733734">
- <ele>233.895193</ele>
- <time>2007-08-19T12:56:58Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159168243" lon="14.949689865">
- <ele>233.895193</ele>
- <time>2007-08-19T12:56:59Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159156799" lon="14.949643135">
- <ele>233.895193</ele>
- <time>2007-08-19T12:57:00Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159137726" lon="14.949598312">
- <ele>233.895193</ele>
- <time>2007-08-19T12:57:01Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159122467" lon="14.949553490">
- <ele>233.795199</ele>
- <time>2007-08-19T12:57:02Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159103394" lon="14.949508667">
- <ele>233.795199</ele>
- <time>2007-08-19T12:57:03Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159088135" lon="14.949461937">
- <ele>233.695205</ele>
- <time>2007-08-19T12:57:04Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159069061" lon="14.949415207">
- <ele>233.595193</ele>
- <time>2007-08-19T12:57:05Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159053802" lon="14.949370384">
- <ele>233.195199</ele>
- <time>2007-08-19T12:57:06Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159038544" lon="14.949321747">
- <ele>232.695192</ele>
- <time>2007-08-19T12:57:07Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159015656" lon="14.949271202">
- <ele>232.495204</ele>
- <time>2007-08-19T12:57:08Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158996582" lon="14.949218750">
- <ele>231.995197</ele>
- <time>2007-08-19T12:57:09Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158977509" lon="14.949161530">
- <ele>231.495191</ele>
- <time>2007-08-19T12:57:10Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158954620" lon="14.949103355">
- <ele>231.095197</ele>
- <time>2007-08-19T12:57:11Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158927917" lon="14.949040413">
- <ele>230.795196</ele>
- <time>2007-08-19T12:57:12Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158901215" lon="14.948974609">
- <ele>230.495196</ele>
- <time>2007-08-19T12:57:13Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158874512" lon="14.948906898">
- <ele>230.195196</ele>
- <time>2007-08-19T12:57:14Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158847809" lon="14.948835373">
- <ele>229.995208</ele>
- <time>2007-08-19T12:57:15Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158821106" lon="14.948761940">
- <ele>229.795201</ele>
- <time>2007-08-19T12:57:16Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158794403" lon="14.948686600">
- <ele>229.395207</ele>
- <time>2007-08-19T12:57:17Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158763885" lon="14.948611259">
- <ele>229.095207</ele>
- <time>2007-08-19T12:57:18Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158737183" lon="14.948536873">
- <ele>228.695194</ele>
- <time>2007-08-19T12:57:19Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158710480" lon="14.948461533">
- <ele>228.395194</ele>
- <time>2007-08-19T12:57:20Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158679962" lon="14.948386192">
- <ele>228.095194</ele>
- <time>2007-08-19T12:57:21Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158649445" lon="14.948313713">
- <ele>227.895206</ele>
- <time>2007-08-19T12:57:22Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158618927" lon="14.948240280">
- <ele>227.595206</ele>
- <time>2007-08-19T12:57:23Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158588409" lon="14.948164940">
- <ele>227.395199</ele>
- <time>2007-08-19T12:57:24Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158561707" lon="14.948089600">
- <ele>227.195193</ele>
- <time>2007-08-19T12:57:25Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158531189" lon="14.948015213">
- <ele>226.995205</ele>
- <time>2007-08-19T12:57:26Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158496857" lon="14.947939873">
- <ele>226.795199</ele>
- <time>2007-08-19T12:57:27Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158470154" lon="14.947864532">
- <ele>226.595192</ele>
- <time>2007-08-19T12:57:28Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158439636" lon="14.947786331">
- <ele>226.395204</ele>
- <time>2007-08-19T12:57:29Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158409119" lon="14.947708130">
- <ele>226.095204</ele>
- <time>2007-08-19T12:57:30Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158378601" lon="14.947629929">
- <ele>225.895198</ele>
- <time>2007-08-19T12:57:31Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158348083" lon="14.947551727">
- <ele>225.695191</ele>
- <time>2007-08-19T12:57:32Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158313751" lon="14.947476387">
- <ele>225.495203</ele>
- <time>2007-08-19T12:57:33Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158283234" lon="14.947402954">
- <ele>225.295197</ele>
- <time>2007-08-19T12:57:34Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158248901" lon="14.947326660">
- <ele>225.095209</ele>
- <time>2007-08-19T12:57:35Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158218384" lon="14.947248459">
- <ele>224.895203</ele>
- <time>2007-08-19T12:57:36Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158191681" lon="14.947170258">
- <ele>224.795209</ele>
- <time>2007-08-19T12:57:37Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158161163" lon="14.947090149">
- <ele>224.595203</ele>
- <time>2007-08-19T12:57:38Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158134460" lon="14.947010040">
- <ele>224.495209</ele>
- <time>2007-08-19T12:57:39Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158103943" lon="14.946931839">
- <ele>224.395196</ele>
- <time>2007-08-19T12:57:40Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158077240" lon="14.946856499">
- <ele>224.295202</ele>
- <time>2007-08-19T12:57:41Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158046722" lon="14.946780205">
- <ele>224.495209</ele>
- <time>2007-08-19T12:57:42Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158016205" lon="14.946702957">
- <ele>224.695196</ele>
- <time>2007-08-19T12:57:43Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157985687" lon="14.946628571">
- <ele>224.795209</ele>
- <time>2007-08-19T12:57:44Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157955170" lon="14.946553230">
- <ele>224.795209</ele>
- <time>2007-08-19T12:57:45Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157924652" lon="14.946477890">
- <ele>224.795209</ele>
- <time>2007-08-19T12:57:46Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157894135" lon="14.946406364">
- <ele>224.695196</ele>
- <time>2007-08-19T12:57:47Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157863617" lon="14.946332932">
- <ele>224.695196</ele>
- <time>2007-08-19T12:57:48Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157840729" lon="14.946258545">
- <ele>224.495209</ele>
- <time>2007-08-19T12:57:49Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157817841" lon="14.946185112">
- <ele>224.395196</ele>
- <time>2007-08-19T12:57:50Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157794952" lon="14.946121216">
- <ele>224.395196</ele>
- <time>2007-08-19T12:57:51Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157772064" lon="14.946069717">
- <ele>224.395196</ele>
- <time>2007-08-19T12:57:52Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157741547" lon="14.946036339">
- <ele>224.395196</ele>
- <time>2007-08-19T12:57:53Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157711029" lon="14.946018219">
- <ele>224.495209</ele>
- <time>2007-08-19T12:57:54Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157684326" lon="14.946011543">
- <ele>224.695196</ele>
- <time>2007-08-19T12:57:55Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157661438" lon="14.946011543">
- <ele>224.795209</ele>
- <time>2007-08-19T12:57:56Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157642365" lon="14.946015358">
- <ele>225.095209</ele>
- <time>2007-08-19T12:57:57Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157630920" lon="14.946020126">
- <ele>225.095209</ele>
- <time>2007-08-19T12:57:58Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157619476" lon="14.946024895">
- <ele>225.095209</ele>
- <time>2007-08-19T12:57:59Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946028709">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:00Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:01Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:02Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:03Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:04Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:05Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:06Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:08Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:09Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:10Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:11Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:12Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:14Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:15Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:16Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:17Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:18Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:19Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:20Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:21Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:22Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:23Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:24Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:26Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:27Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:28Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:29Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:30Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:31Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:32Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:33Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:34Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:35Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:36Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:38Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157611847" lon="14.946029663">
- <ele>225.095209</ele>
- <time>2007-08-19T12:58:39Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157546997" lon="14.946068764">
- <ele>223.695202</ele>
- <time>2007-08-19T12:58:40Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157531738" lon="14.946082115">
- <ele>223.895208</ele>
- <time>2007-08-19T12:58:41Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157512665" lon="14.946102142">
- <ele>224.295202</ele>
- <time>2007-08-19T12:58:42Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157485962" lon="14.946134567">
- <ele>224.595203</ele>
- <time>2007-08-19T12:58:43Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157459259" lon="14.946183205">
- <ele>224.995197</ele>
- <time>2007-08-19T12:58:44Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157436371" lon="14.946249962">
- <ele>225.195203</ele>
- <time>2007-08-19T12:58:45Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157424927" lon="14.946332932">
- <ele>225.395191</ele>
- <time>2007-08-19T12:58:46Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157424927" lon="14.946428299">
- <ele>225.795204</ele>
- <time>2007-08-19T12:58:47Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157436371" lon="14.946530342">
- <ele>225.995192</ele>
- <time>2007-08-19T12:58:48Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157463074" lon="14.946636200">
- <ele>226.395204</ele>
- <time>2007-08-19T12:58:49Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157505035" lon="14.946760178">
- <ele>226.795199</ele>
- <time>2007-08-19T12:58:50Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157562256" lon="14.946901321">
- <ele>227.095199</ele>
- <time>2007-08-19T12:58:51Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157630920" lon="14.947066307">
- <ele>227.495193</ele>
- <time>2007-08-19T12:58:52Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157707214" lon="14.947244644">
- <ele>227.995200</ele>
- <time>2007-08-19T12:58:53Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157794952" lon="14.947442055">
- <ele>228.495206</ele>
- <time>2007-08-19T12:58:54Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157894135" lon="14.947673798">
- <ele>228.695194</ele>
- <time>2007-08-19T12:58:55Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.157993317" lon="14.947897911">
- <ele>229.295195</ele>
- <time>2007-08-19T12:58:56Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158100128" lon="14.948138237">
- <ele>229.795201</ele>
- <time>2007-08-19T12:58:57Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158210754" lon="14.948388100">
- <ele>230.595208</ele>
- <time>2007-08-19T12:58:58Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158329010" lon="14.948653221">
- <ele>231.695197</ele>
- <time>2007-08-19T12:58:59Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158447266" lon="14.948929787">
- <ele>232.695192</ele>
- <time>2007-08-19T12:59:00Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158573151" lon="14.949225426">
- <ele>233.495199</ele>
- <time>2007-08-19T12:59:01Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158695221" lon="14.949535370">
- <ele>234.295206</ele>
- <time>2007-08-19T12:59:02Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158817291" lon="14.949858665">
- <ele>234.795194</ele>
- <time>2007-08-19T12:59:03Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.158943176" lon="14.950191498">
- <ele>235.495207</ele>
- <time>2007-08-19T12:59:04Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159076691" lon="14.950534821">
- <ele>236.195202</ele>
- <time>2007-08-19T12:59:05Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159214020" lon="14.950886726">
- <ele>237.495197</ele>
- <time>2007-08-19T12:59:06Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159355164" lon="14.951239586">
- <ele>239.195204</ele>
- <time>2007-08-19T12:59:07Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159496307" lon="14.951588631">
- <ele>241.095200</ele>
- <time>2007-08-19T12:59:08Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159641266" lon="14.951932907">
- <ele>243.295196</ele>
- <time>2007-08-19T12:59:09Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159790039" lon="14.952276230">
- <ele>245.795192</ele>
- <time>2007-08-19T12:59:10Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.159934998" lon="14.952618599">
- <ele>248.695201</ele>
- <time>2007-08-19T12:59:11Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160072327" lon="14.952955246">
- <ele>251.995205</ele>
- <time>2007-08-19T12:59:12Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160213470" lon="14.953289986">
- <ele>255.495196</ele>
- <time>2007-08-19T12:59:13Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160350800" lon="14.953624725">
- <ele>258.895193</ele>
- <time>2007-08-19T12:59:14Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160488129" lon="14.953963280">
- <ele>261.695208</ele>
- <time>2007-08-19T12:59:15Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160617828" lon="14.954303741">
- <ele>264.395192</ele>
- <time>2007-08-19T12:59:16Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160747528" lon="14.954645157">
- <ele>267.295201</ele>
- <time>2007-08-19T12:59:17Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.160881042" lon="14.954983711">
- <ele>270.395198</ele>
- <time>2007-08-19T12:59:18Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.161022186" lon="14.955316544">
- <ele>273.195194</ele>
- <time>2007-08-19T12:59:19Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.161178589" lon="14.955635071">
- <ele>275.995191</ele>
- <time>2007-08-19T12:59:20Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.161357880" lon="14.955931664">
- <ele>278.595200</ele>
- <time>2007-08-19T12:59:21Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.161560059" lon="14.956205368">
- <ele>280.695202</ele>
- <time>2007-08-19T12:59:22Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.161781311" lon="14.956457138">
- <ele>282.595197</ele>
- <time>2007-08-19T12:59:23Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.162021637" lon="14.956686974">
- <ele>284.295205</ele>
- <time>2007-08-19T12:59:24Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.162273407" lon="14.956892967">
- <ele>285.695194</ele>
- <time>2007-08-19T12:59:25Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.162536621" lon="14.957079887">
- <ele>287.895209</ele>
- <time>2007-08-19T12:59:26Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.162807465" lon="14.957256317">
- <ele>290.695205</ele>
- <time>2007-08-19T12:59:27Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.163074493" lon="14.957431793">
- <ele>293.695208</ele>
- <time>2007-08-19T12:59:28Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.163345337" lon="14.957610130">
- <ele>295.795192</ele>
- <time>2007-08-19T12:59:29Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.163616180" lon="14.957793236">
- <ele>297.195199</ele>
- <time>2007-08-19T12:59:30Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.163887024" lon="14.957975388">
- <ele>299.395195</ele>
- <time>2007-08-19T12:59:31Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.164154053" lon="14.958160400">
- <ele>302.095198</ele>
- <time>2007-08-19T12:59:32Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.164432526" lon="14.958343506">
- <ele>303.395193</ele>
- <time>2007-08-19T12:59:33Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.164714813" lon="14.958523750">
- <ele>304.595194</ele>
- <time>2007-08-19T12:59:34Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.164993286" lon="14.958703041">
- <ele>306.595202</ele>
- <time>2007-08-19T12:59:35Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.165271759" lon="14.958887100">
- <ele>309.295205</ele>
- <time>2007-08-19T12:59:36Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.165546417" lon="14.959076881">
- <ele>312.395183</ele>
- <time>2007-08-19T12:59:37Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.165813446" lon="14.959269524">
- <ele>315.795199</ele>
- <time>2007-08-19T12:59:38Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.166065216" lon="14.959473610">
- <ele>319.795215</ele>
- <time>2007-08-19T12:59:39Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.166313171" lon="14.959686279">
- <ele>324.295182</ele>
- <time>2007-08-19T12:59:40Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.166557312" lon="14.959908485">
- <ele>329.495200</ele>
- <time>2007-08-19T12:59:41Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.166797638" lon="14.960133553">
- <ele>334.795192</ele>
- <time>2007-08-19T12:59:42Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.167030334" lon="14.960358620">
- <ele>339.495185</ele>
- <time>2007-08-19T12:59:43Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.167259216" lon="14.960584641">
- <ele>344.095201</ele>
- <time>2007-08-19T12:59:44Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.167484283" lon="14.960804939">
- <ele>348.295206</ele>
- <time>2007-08-19T12:59:45Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.167705536" lon="14.961028099">
- <ele>351.895209</ele>
- <time>2007-08-19T12:59:46Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.167922974" lon="14.961256981">
- <ele>355.295188</ele>
- <time>2007-08-19T12:59:47Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.168136597" lon="14.961489677">
- <ele>358.395203</ele>
- <time>2007-08-19T12:59:48Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.168350220" lon="14.961730003">
- <ele>360.995193</ele>
- <time>2007-08-19T12:59:49Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.168563843" lon="14.961977005">
- <ele>363.695196</ele>
- <time>2007-08-19T12:59:50Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.168769836" lon="14.962231636">
- <ele>367.095212</ele>
- <time>2007-08-19T12:59:51Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.168968201" lon="14.962492943">
- <ele>370.895203</ele>
- <time>2007-08-19T12:59:52Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.169162750" lon="14.962761879">
- <ele>374.795207</ele>
- <time>2007-08-19T12:59:53Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.169353485" lon="14.963031769">
- <ele>378.895198</ele>
- <time>2007-08-19T12:59:54Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.169544220" lon="14.963293076">
- <ele>383.295190</ele>
- <time>2007-08-19T12:59:55Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.169734955" lon="14.963551521">
- <ele>386.995206</ele>
- <time>2007-08-19T12:59:56Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.169929504" lon="14.963801384">
- <ele>390.095184</ele>
- <time>2007-08-19T12:59:57Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.170120239" lon="14.964044571">
- <ele>392.995212</ele>
- <time>2007-08-19T12:59:58Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.170314789" lon="14.964282990">
- <ele>395.595202</ele>
- <time>2007-08-19T12:59:59Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.170513153" lon="14.964521408">
- <ele>397.995204</ele>
- <time>2007-08-19T13:00:00Z</time>
- <fix>3d</fix>
- </trkpt>
- <trkpt lat="51.170711517" lon="14.964761734">
- <ele>400.095207</ele>
- <time>2007-08-19T13:00:01Z</time>
- <fix>3d</fix>
- </trkpt>
- </trkseg>
- </trk>
-</gpx>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="51.158882000" minlon="14.902600000" maxlat="51.363167000" maxlon="14.952033000"/>
- <wpt lat="51.158882000" lon="14.950277000">
- <ele>237.134</ele>
- <name>EDBX</name>
- <cmt>EDBX</cmt>
- <desc>EDBX</desc>
- </wpt>
- <wpt lat="51.302700000" lon="14.902600000">
- <ele>609.600</ele>
- <name>Horka,NOL(GM)</name>
- <cmt>Horka,NOL(GM)</cmt>
- <desc>Horka,NOL(GM)</desc>
- </wpt>
- <wpt lat="51.343624000" lon="14.952033000">
- <ele>609.600</ele>
- <name>RO(EDBR)-N</name>
- <cmt>RO(EDBR)-N</cmt>
- <desc>RO(EDBR)-N</desc>
- </wpt>
- <wpt lat="51.363167000" lon="14.950000000">
- <ele>609.600</ele>
- <name>EDBR</name>
- <cmt>EDBR</cmt>
- <desc>EDBR</desc>
- </wpt>
- <rte>
- <name>EDBX - EDBR</name>
- <desc>PocketFMS flightplan</desc>
- <rtept lat="51.158882000" lon="14.950277000">
- <ele>237.134</ele>
- <name>EDBX</name>
- </rtept>
- <rtept lat="51.302700000" lon="14.902600000">
- <ele>609.600</ele>
- <name>Horka,NOL(GM)</name>
- </rtept>
- <rtept lat="51.343624000" lon="14.952033000">
- <ele>609.600</ele>
- <name>RO(EDBR)-N</name>
- </rtept>
- <rtept lat="51.363167000" lon="14.950000000">
- <ele>157.582</ele>
- <name>EDBR</name>
- </rtept>
- </rte>
-</gpx>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<PocketFMSFlightplan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.PocketFMS.com/XMLSchema/PocketFMSNavlog-1.2.0.xsd"><META><TakeOffDateUTC>2009-03-03</TakeOffDateUTC><DOF>090303</DOF><TakeOffTimeUTC>10:05:00</TakeOffTimeUTC><ICAOETD Value="1005" Unit="HHMM"/><ICAOTOTALEET Value="0009" Unit="HHMM"/><TOTALEET Value="00:09" Unit="h:m"/><Departure><StringIdent>EDBX GORLITZ GORLITZ</StringIdent><Latitude>51.158882</Latitude><Longitude>14.950277</Longitude><FriendlyShortname>EDBX</FriendlyShortname><Fullname>Gorlitz</Fullname><Elevation>778</Elevation><RNAV1 BEACONIDENT="OKX" BEACONFREQUENCY="114.85" BEACONRADIAL="346.701874" BEACONDISTANCENM="15.677554"/><RNAV2 BEACONIDENT="HDO" BEACONFREQUENCY="115.00" BEACONRADIAL="55.517551" BEACONDISTANCENM="25.938663"/><DetailedObjectInfo><AirportData><Cityname>GORLITZ</Cityname><type></type><agency></agency><fuel></fuel><oil></oil><HasPrecisionApproachYN></HasPrecisionApproachYN><HasNonPrecisionApproachYN></HasNonPrecisionApproachYN><HasVFRReportingPointsYN></HasVFRReportingPointsYN><LongestHardRunway Value="0"/><LongestSoftRunway Value="2461"/><HasWaterRunwayYN></HasWaterRunwayYN><IsAbandonedYN></IsAbandonedYN><AllowedAircraftTypes></AllowedAircraftTypes><HasMetarTafYN></HasMetarTafYN><PPRYN></PPRYN><EmergencyUseOnlyYN></EmergencyUseOnlyYN><VisibleButDestroyedYN></VisibleButDestroyedYN></AirportData><Communications><COMM CommType="INFO" Freq1="122.000" Freq2="0.000" Freq3="0.000" Freq4="0.000" Freq5="0.000" Sector="" OprHrs="" CommRemarks=""/></Communications></DetailedObjectInfo></Departure><Arrival><StringIdent>EDBR ROTHENBURG GORLITZ ROTHENBURG/GORLITZ</StringIdent><Latitude>51.363167</Latitude><Longitude>14.950000</Longitude><FriendlyShortname>EDBR</FriendlyShortname><Fullname>ROTHENBURG GORLITZ</Fullname><Elevation>00517</Elevation><RNAV1 BEACONIDENT="OKX" BEACONFREQUENCY="114.85" BEACONRADIAL="351.663544" BEACONDISTANCENM="27.800840"/><RNAV2 BEACONIDENT="HDO" BEACONFREQUENCY="115.00" BEACONRADIAL="37.742104" BEACONDISTANCENM="34.056461"/><DetailedObjectInfo><AirportData><Cityname>ROTHENBURG/GORLITZ</Cityname><type>D</type><agency>CI</agency><fuel></fuel><oil></oil><HasPrecisionApproachYN></HasPrecisionApproachYN><HasNonPrecisionApproachYN></HasNonPrecisionApproachYN><HasVFRReportingPointsYN>N</HasVFRReportingPointsYN><LongestHardRunway Value="8202"/><LongestSoftRunway Value="4003"/><HasWaterRunwayYN>N</HasWaterRunwayYN><IsAbandonedYN></IsAbandonedYN><AllowedAircraftTypes></AllowedAircraftTypes><HasMetarTafYN></HasMetarTafYN><PPRYN></PPRYN><EmergencyUseOnlyYN></EmergencyUseOnlyYN><VisibleButDestroyedYN></VisibleButDestroyedYN></AirportData><Communications><COMM CommType="AAS" Freq1="125.800" Freq2="0.000" Freq3="0.000" Freq4="0.000" Freq5="0.000" Sector="" OprHrs="" CommRemarks=""/><COMM CommType="INFO" Freq1="123.250" Freq2="0.000" Freq3="0.000" Freq4="0.000" Freq5="0.000" Sector="3NM 3000 FT. AGL" OprHrs="" CommRemarks=""/></Communications><Remarks><Remark RemarkType="CAUTION" RemarkText="Gldr, ultralgt, model acft, balloon and PJE act."/><Remark RemarkType="CSTMS/IMG" RemarkText="CSTMS avbl PPR (24 hr PN, dur afld opr hr)."/><Remark RemarkType="FUEL" RemarkText="(NC 100LL, A1)"/><Remark RemarkType="OPR HOURS" RemarkText="Opr 0900-1500Z, O/T 24 hr PPR (0800-1600Z or SS+30, OT 24 hr PPR DT)."/><Remark RemarkType="WEB" RemarkText="<a href=http://www.flugplatz-rothenburg-goerlitz.de/>http://www.flugplatz-rothenburg-goerlitz.de/</a>"/></Remarks></DetailedObjectInfo></Arrival><AircraftIdentification></AircraftIdentification><RoutingString>DCT OKX347024 DCT OKX352027</RoutingString><FlightRules>V</FlightRules><FlightType>G</FlightType><AircraftType></AircraftType><WakeTurbulence>L</WakeTurbulence><Equipment></Equipment><Transponder></Transponder><AircraftColorAndMarkings></AircraftColorAndMarkings><PilotInCommand>TOBIAS KRETSCHMAR</PilotInCommand><PilotInCommandCompany></PilotInCommandCompany><PilotInCommandMobilePhone>+491739170322</PilotInCommandMobilePhone><PilotInCommandPhone>+493584227200</PilotInCommandPhone><PilotInCommandFax>+493584227263</PilotInCommandFax><FlightRemarks></FlightRemarks><FlightPlanOtherInformation></FlightPlanOtherInformation><ICAOEndurance Value="0410" Unit="HHMM"/><ICAOCruiseAltitude>A020</ICAOCruiseAltitude></META><FUEL><TotalTripFuel Value="2.700000" Unit="ltr"/><TaxiAndDepartureFuel Value="2.500000" Unit="ltr"/><ArrivalAndTaxiFuel Value="2.500000" Unit="ltr"/><AlternateApproachFuel Value="2.500000" Unit="ltr"/><ReserveFuel Value="15.000000" Unit="ltr" Duration="60" DurationUnit="min"/><ContingencyFuel Value="0.000000" Unit="ltr" Percentage="0"/><LoadedFuel Value="63.380280" Unit="ltr"/><TotalFuel Value="27.442703" Unit="ltr"/><LongestAlternateFuel Value="2.242704" Unit="ltr"/><LongestAlternateDistance Value="27.715340" Unit="km"/></FUEL><SUPPLEMENTARYINFORMATION><Endurance Value="04:10" Unit="h:m"/><POB>001</POB><bRadio>0</bRadio><bRadioUHF>0</bRadioUHF><bRadioVHF>0</bRadioVHF><bRadioELBA>0</bRadioELBA><bSurvivalEquipment>0</bSurvivalEquipment><bSurvivalPolar>0</bSurvivalPolar><bSurvivalDesert>0</bSurvivalDesert><bSurvivalMaritime>0</bSurvivalMaritime><bSurvivalJungle>0</bSurvivalJungle><bJackets>0</bJackets><bJacketsLights>0</bJacketsLights><bJacketsFluores>0</bJacketsFluores><bJacketsUHF>0</bJacketsUHF><bJacketsVHF>0</bJacketsVHF><bDinghies>0</bDinghies><DinghiesNumber></DinghiesNumber><DinghiesCapacity></DinghiesCapacity><bDinghiesCover>0</bDinghiesCover><DinghiesCoverColor></DinghiesCoverColor></SUPPLEMENTARYINFORMATION><LIB LibID="1"><FromPoint><StringIdent>EDBX GORLITZ GORLITZ</StringIdent><Latitude>51.158882</Latitude><Longitude>14.950277</Longitude><FriendlyShortname>EDBX</FriendlyShortname><Fullname>Gorlitz</Fullname><Elevation>778</Elevation><RNAV1 BEACONIDENT="OKX" BEACONFREQUENCY="114.85" BEACONRADIAL="346.701874" BEACONDISTANCENM="15.677554"/><RNAV2 BEACONIDENT="HDO" BEACONFREQUENCY="115.00" BEACONRADIAL="55.517551" BEACONDISTANCENM="25.938663"/><DetailedObjectInfo><AirportData><Cityname>GORLITZ</Cityname><type></type><agency></agency><fuel></fuel><oil></oil><HasPrecisionApproachYN></HasPrecisionApproachYN><HasNonPrecisionApproachYN></HasNonPrecisionApproachYN><HasVFRReportingPointsYN></HasVFRReportingPointsYN><LongestHardRunway Value="0"/><LongestSoftRunway Value="2461"/><HasWaterRunwayYN></HasWaterRunwayYN><IsAbandonedYN></IsAbandonedYN><AllowedAircraftTypes></AllowedAircraftTypes><HasMetarTafYN></HasMetarTafYN><PPRYN></PPRYN><EmergencyUseOnlyYN></EmergencyUseOnlyYN><VisibleButDestroyedYN></VisibleButDestroyedYN></AirportData><Communications><COMM CommType="INFO" Freq1="122.000" Freq2="0.000" Freq3="0.000" Freq4="0.000" Freq5="0.000" Sector="" OprHrs="" CommRemarks=""/></Communications></DetailedObjectInfo></FromPoint><ToPoint><StringIdent>{x} HORKA,NOL(GM)</StringIdent><Latitude>51.302700</Latitude><Longitude>14.902600</Longitude><FriendlyShortname>Horka,NOL(GM)</FriendlyShortname><Fullname>Horka,NOL(GM)</Fullname><Elevation></Elevation><RNAV1 BEACONIDENT="OKX" BEACONFREQUENCY="114.85" BEACONRADIAL="346.577057" BEACONDISTANCENM="24.490610"/><RNAV2 BEACONIDENT="HDO" BEACONFREQUENCY="115.00" BEACONRADIAL="39.610226" BEACONDISTANCENM="30.154068"/></ToPoint><ETAUTC>10:12:12</ETAUTC><MSA Value="3200" Unit="ft"/><PlannedAltitude Value="2000" Unit="ft"/><OAT Value="15" Unit="°C"/><IAS Value="180" Unit="kmh"/><QNH Value="1013" Unit="mb"/><TAS Value="185" Unit="kmh"/><ALTERNATEIDENT>EDCI</ALTERNATEIDENT><ALTERNATEDISTANCE Value="27.715340" Unit="km"/><FUEL Value="2.300000" Unit="ltr"/><WINDDIRECTION Value="360" Unit="°M"/><WINDSPEED Value="0" Unit="kmh"/><AVARAGEVARIATION>3</AVARAGEVARIATION><ETE Value="00:06:26" Unit="h:m"/><ETECUMMULATIVE Value="00:06:26" Unit="h:m"/><TRUETRACK Value="348" Unit="tt"/><MAGNETICTRACK Value="345" Unit="mt"/><WINDCORRECTIONANGLE>0R</WINDCORRECTIONANGLE><TRUEHEADING Value="348" Unit="th"/><MAGNETICHEADING Value="345" Unit="th"/><GROUNDSPEED Value="185" Unit="kmh"/><DistanceCummulative Value="16.299999" Unit="km"/><Distance Value="16.299999" Unit="km"/><WXSignificant></WXSignificant><WXMETAR></WXMETAR><WXSHORTTAF></WXSHORTTAF><WXLONGTAF></WXLONGTAF><WXALLTAF></WXALLTAF><AirspacesCrossed><Airspace><AirspaceEntryPoint><Latitude>51.158882</Latitude><Longitude>14.950277</Longitude><ETECUMMULATIVE Value="00:00:00" Unit="h:m"/><ETAUTC>00:00:00</ETAUTC></AirspaceEntryPoint><AirspaceName>MUNCHEN FIR</AirspaceName><AirspaceType>08</AirspaceType><AirspaceComm1></AirspaceComm1><AirspaceComm2></AirspaceComm2><AirspaceCommName></AirspaceCommName><AirspaceCommAuth></AirspaceCommAuth><AirspaceLowerAltFt>GND</AirspaceLowerAltFt><AirspaceUpperAltFt>FL 245</AirspaceUpperAltFt><AirspaceClass></AirspaceClass><AirspaceClassRemarks></AirspaceClassRemarks><AirspaceSUASIdentifier></AirspaceSUASIdentifier><AirspaceRemarks></AirspaceRemarks><AirspaceActivity></AirspaceActivity><AirspaceActiveFromDateTime></AirspaceActiveFromDateTime><AirspaceActiveUpToDateTime></AirspaceActiveUpToDateTime></Airspace></AirspacesCrossed></LIB><LIB LibID="2"><FromPoint><StringIdent>{x} HORKA,NOL(GM)</StringIdent><Latitude>51.302700</Latitude><Longitude>14.902600</Longitude><FriendlyShortname>Horka,NOL(GM)</FriendlyShortname><Fullname>Horka,NOL(GM)</Fullname><Elevation></Elevation><RNAV1 BEACONIDENT="OKX" BEACONFREQUENCY="114.85" BEACONRADIAL="346.577057" BEACONDISTANCENM="24.490610"/><RNAV2 BEACONIDENT="HDO" BEACONFREQUENCY="115.00" BEACONRADIAL="39.610226" BEACONDISTANCENM="30.154068"/></FromPoint><ToPoint><StringIdent>RO(EDBR)-NDB ROTHENBURG</StringIdent><Latitude>51.343624</Latitude><Longitude>14.952033</Longitude><FriendlyShortname>RO(EDBR)-N</FriendlyShortname><Fullname>ROTHENBURG</Fullname><Elevation>U</Elevation><RNAV1 BEACONIDENT="OKX" BEACONFREQUENCY="114.85" BEACONRADIAL="351.545258" BEACONDISTANCENM="26.627037"/><RNAV2 BEACONIDENT="HDO" BEACONFREQUENCY="115.00" BEACONRADIAL="39.148022" BEACONDISTANCENM="33.219891"/></ToPoint><ETAUTC>10:14:02</ETAUTC><MSA Value="3200" Unit="ft"/><PlannedAltitude Value="2000" Unit="ft"/><OAT Value="15" Unit="°C"/><IAS Value="180" Unit="kmh"/><QNH Value="1013" Unit="mb"/><TAS Value="185" Unit="kmh"/><ALTERNATEIDENT>EDBX</ALTERNATEIDENT><ALTERNATEDISTANCE Value="20.529016" Unit="km"/><FUEL Value="0.400000" Unit="ltr"/><WINDDIRECTION Value="360" Unit="°M"/><WINDSPEED Value="0" Unit="kmh"/><AVARAGEVARIATION>3</AVARAGEVARIATION><ETE Value="00:01:50" Unit="h:m"/><ETECUMMULATIVE Value="00:08:16" Unit="h:m"/><TRUETRACK Value="37" Unit="tt"/><MAGNETICTRACK Value="34" Unit="mt"/><WINDCORRECTIONANGLE>0R</WINDCORRECTIONANGLE><TRUEHEADING Value="37" Unit="th"/><MAGNETICHEADING Value="34" Unit="th"/><GROUNDSPEED Value="185" Unit="kmh"/><DistanceCummulative Value="22.000000" Unit="km"/><Distance Value="5.700000" Unit="km"/><WXSignificant></WXSignificant><WXMETAR></WXMETAR><WXSHORTTAF></WXSHORTTAF><WXLONGTAF></WXLONGTAF><WXALLTAF></WXALLTAF><AirspacesCrossed><Airspace><AirspaceEntryPoint><Latitude>51.302700</Latitude><Longitude>14.902600</Longitude><ETECUMMULATIVE Value="00:00:00" Unit="h:m"/><ETAUTC>00:00:00</ETAUTC></AirspaceEntryPoint><AirspaceName>MUNCHEN FIR</AirspaceName><AirspaceType>08</AirspaceType><AirspaceComm1></AirspaceComm1><AirspaceComm2></AirspaceComm2><AirspaceCommName></AirspaceCommName><AirspaceCommAuth></AirspaceCommAuth><AirspaceLowerAltFt>GND</AirspaceLowerAltFt><AirspaceUpperAltFt>FL 245</AirspaceUpperAltFt><AirspaceClass></AirspaceClass><AirspaceClassRemarks></AirspaceClassRemarks><AirspaceSUASIdentifier></AirspaceSUASIdentifier><AirspaceRemarks></AirspaceRemarks><AirspaceActivity></AirspaceActivity><AirspaceActiveFromDateTime></AirspaceActiveFromDateTime><AirspaceActiveUpToDateTime></AirspaceActiveUpToDateTime></Airspace></AirspacesCrossed></LIB><LIB LibID="3"><FromPoint><StringIdent>RO(EDBR)-NDB ROTHENBURG</StringIdent><Latitude>51.343624</Latitude><Longitude>14.952033</Longitude><FriendlyShortname>RO(EDBR)-N</FriendlyShortname><Fullname>ROTHENBURG</Fullname><Elevation>U</Elevation><RNAV1 BEACONIDENT="OKX" BEACONFREQUENCY="114.85" BEACONRADIAL="351.545258" BEACONDISTANCENM="26.627037"/><RNAV2 BEACONIDENT="HDO" BEACONFREQUENCY="115.00" BEACONRADIAL="39.148022" BEACONDISTANCENM="33.219891"/></FromPoint><ToPoint><StringIdent>EDBR ROTHENBURG GORLITZ ROTHENBURG/GORLITZ</StringIdent><Latitude>51.363167</Latitude><Longitude>14.950000</Longitude><FriendlyShortname>EDBR</FriendlyShortname><Fullname>ROTHENBURG GORLITZ</Fullname><Elevation>00517</Elevation><RNAV1 BEACONIDENT="OKX" BEACONFREQUENCY="114.85" BEACONRADIAL="351.663544" BEACONDISTANCENM="27.800840"/><RNAV2 BEACONIDENT="HDO" BEACONFREQUENCY="115.00" BEACONRADIAL="37.742104" BEACONDISTANCENM="34.056461"/><DetailedObjectInfo><AirportData><Cityname>ROTHENBURG/GORLITZ</Cityname><type>D</type><agency>CI</agency><fuel></fuel><oil></oil><HasPrecisionApproachYN></HasPrecisionApproachYN><HasNonPrecisionApproachYN></HasNonPrecisionApproachYN><HasVFRReportingPointsYN>N</HasVFRReportingPointsYN><LongestHardRunway Value="8202"/><LongestSoftRunway Value="4003"/><HasWaterRunwayYN>N</HasWaterRunwayYN><IsAbandonedYN></IsAbandonedYN><AllowedAircraftTypes></AllowedAircraftTypes><HasMetarTafYN></HasMetarTafYN><PPRYN></PPRYN><EmergencyUseOnlyYN></EmergencyUseOnlyYN><VisibleButDestroyedYN></VisibleButDestroyedYN></AirportData><Communications><COMM CommType="AAS" Freq1="125.800" Freq2="0.000" Freq3="0.000" Freq4="0.000" Freq5="0.000" Sector="" OprHrs="" CommRemarks=""/><COMM CommType="INFO" Freq1="123.250" Freq2="0.000" Freq3="0.000" Freq4="0.000" Freq5="0.000" Sector="3NM 3000 FT. AGL" OprHrs="" CommRemarks=""/></Communications><Remarks><Remark RemarkType="CAUTION" RemarkText="Gldr, ultralgt, model acft, balloon and PJE act."/><Remark RemarkType="CSTMS/IMG" RemarkText="CSTMS avbl PPR (24 hr PN, dur afld opr hr)."/><Remark RemarkType="FUEL" RemarkText="(NC 100LL, A1)"/><Remark RemarkType="OPR HOURS" RemarkText="Opr 0900-1500Z, O/T 24 hr PPR (0800-1600Z or SS+30, OT 24 hr PPR DT)."/><Remark RemarkType="WEB" RemarkText="<a href=http://www.flugplatz-rothenburg-goerlitz.de/>http://www.flugplatz-rothenburg-goerlitz.de/</a>"/></Remarks></DetailedObjectInfo></ToPoint><ETAUTC>10:14:44</ETAUTC><MSA Value="3200" Unit="ft"/><PlannedAltitude Value="2000" Unit="ft"/><OAT Value="15" Unit="°C"/><IAS Value="180" Unit="kmh"/><QNH Value="1013" Unit="mb"/><TAS Value="185" Unit="kmh"/><ALTERNATEIDENT>EDBX</ALTERNATEIDENT><ALTERNATEDISTANCE Value="22.700459" Unit="km"/><FUEL Value="0.000000" Unit="ltr"/><WINDDIRECTION Value="360" Unit="°M"/><WINDSPEED Value="0" Unit="kmh"/><AVARAGEVARIATION>3</AVARAGEVARIATION><ETE Value="00:00:42" Unit="h:m"/><ETECUMMULATIVE Value="00:08:58" Unit="h:m"/><TRUETRACK Value="356" Unit="tt"/><MAGNETICTRACK Value="353" Unit="mt"/><WINDCORRECTIONANGLE>0R</WINDCORRECTIONANGLE><TRUEHEADING Value="356" Unit="th"/><MAGNETICHEADING Value="353" Unit="th"/><GROUNDSPEED Value="185" Unit="kmh"/><DistanceCummulative Value="24.200001" Unit="km"/><Distance Value="2.200000" Unit="km"/><WXSignificant></WXSignificant><WXMETAR></WXMETAR><WXSHORTTAF></WXSHORTTAF><WXLONGTAF></WXLONGTAF><WXALLTAF></WXALLTAF><AirspacesCrossed><Airspace><AirspaceEntryPoint><Latitude>51.343624</Latitude><Longitude>14.952033</Longitude><ETECUMMULATIVE Value="00:00:00" Unit="h:m"/><ETAUTC>00:00:00</ETAUTC></AirspaceEntryPoint><AirspaceName>MUNCHEN FIR</AirspaceName><AirspaceType>08</AirspaceType><AirspaceComm1></AirspaceComm1><AirspaceComm2></AirspaceComm2><AirspaceCommName></AirspaceCommName><AirspaceCommAuth></AirspaceCommAuth><AirspaceLowerAltFt>GND</AirspaceLowerAltFt><AirspaceUpperAltFt>FL 245</AirspaceUpperAltFt><AirspaceClass></AirspaceClass><AirspaceClassRemarks></AirspaceClassRemarks><AirspaceSUASIdentifier></AirspaceSUASIdentifier><AirspaceRemarks></AirspaceRemarks><AirspaceActivity></AirspaceActivity><AirspaceActiveFromDateTime></AirspaceActiveFromDateTime><AirspaceActiveUpToDateTime></AirspaceActiveUpToDateTime></Airspace></AirspacesCrossed></LIB><AIRCRAFT><AircraftDescription>D-MVBB/Fascination</AircraftDescription><SpeedVx Value="100" Unit="kmh"/><SpeedVy Value="140" Unit="kmh"/><SpeedCruise Value="180" Unit="kmh"/><SpeedHolding Value="120" Unit="kmh"/><SpeedApproach Value="140" Unit="kmh"/><FuelConsumptionVx Value="24.000000" Unit="ltr"/><FuelConsumptionVy Value="18.000000" Unit="ltr"/><FuelConsumptionCruise Value="15.000000" Unit="ltr"/><FuelConsumptionHolding Value="10.000000" Unit="ltr"/><FuelConsumptionApproach Value="10.000000" Unit="ltr"/><AvarageRateOfDescend Value="400.000000" Unit="fpm"/><AvarageRateOfClimb Value="250.000000" Unit="fpm"/><SuitableDefinitions><CivilianAirports>1</CivilianAirports><MilitaryAirports>0</MilitaryAirports><JoinedAirports>1</JoinedAirports><ULMAirports>1</ULMAirports><GliderAirports>0</GliderAirports><HeliAirports>0</HeliAirports><WaterAirports>0</WaterAirports><MusthavePrecisionApproach>0</MusthavePrecisionApproach><MusthaveNonPrecisionApproach>0</MusthaveNonPrecisionApproach><MinimumHardRunwayLength Value="304.799988" Unit="mtr"/><MinimumSoftRunwayLength Value="304.799988" Unit="mtr"/><MinimumCloudbase Value="500.000000" Unit="ft"/><MaximumCrosswind Value="22.000000" Unit="kts"/></SuitableDefinitions><WeightAndBalance><WBData><WBDataRecord WBDescription="Wägebericht"><Weight Value="301.000031" Unit="KG"/><Arm Value="58.000000" Unit="CM"/><Moment Value="174.580017" Unit="KG.M"/></WBDataRecord><WBDataRecord WBDescription="Pilot"><Weight Value="85.000000" Unit="KG"/><Arm Value="120.000000" Unit="CM"/><Moment Value="102.000000" Unit="KG.M"/></WBDataRecord><WBDataRecord WBDescription="Passagier"><Weight Value="0.000000" Unit="KG"/><Arm Value="120.000000" Unit="CM"/><Moment Value="0.000000" Unit="KG.M"/></WBDataRecord><WBDataRecord WBDescription="Fuel"><Weight Value="45.000000" Unit="KG"/><Arm Value="40.000000" Unit="CM"/><Moment Value="18.000000" Unit="KG.M"/></WBDataRecord><WBDataRecord WBDescription="Gepäck"><Weight Value="0.000000" Unit="KG"/><Arm Value="180.000000" Unit="CM"/><Moment Value="0.000000" Unit="KG.M"/></WBDataRecord><PlaneTotalWeight Value="431.000031" Unit="KG"/><PlaneTotalArm Value="68.348022" Unit="CM"/><PlaneTotalMoment Value="294.580017" Unit="KG.M"/></WBData><WBCGLimits><WBMomentLimitPoint><YValue_Weight Value="300.999390" Unit="KG"/><XValue_CG Value="68.000000" Unit="CM"/></WBMomentLimitPoint><WBMomentLimitPoint><YValue_Weight Value="449.999939" Unit="KG"/><XValue_CG Value="68.000000" Unit="CM"/></WBMomentLimitPoint><WBMomentLimitPoint><YValue_Weight Value="449.999939" Unit="KG"/><XValue_CG Value="84.000000" Unit="CM"/></WBMomentLimitPoint><WBMomentLimitPoint><YValue_Weight Value="300.999390" Unit="KG"/><XValue_CG Value="84.000000" Unit="CM"/></WBMomentLimitPoint></WBCGLimits></WeightAndBalance></AIRCRAFT></PocketFMSFlightplan>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="51.158882000" minlon="14.902600000" maxlat="51.363167000" maxlon="14.952033000"/>
- <wpt lat="51.158882000" lon="14.950277000">
- <name>EDBX </name>
- <cmt>EDBX </cmt>
- <desc>EDBX </desc>
- </wpt>
- <wpt lat="51.302700000" lon="14.902600000">
- <name>Horka,NOL(GM) </name>
- <cmt>Horka,NOL(GM) </cmt>
- <desc>Horka,NOL(GM) </desc>
- </wpt>
- <wpt lat="51.343624000" lon="14.952033000">
- <name>RO(EDBR)-N </name>
- <cmt>RO(EDBR)-N </cmt>
- <desc>RO(EDBR)-N </desc>
- </wpt>
- <wpt lat="51.363167000" lon="14.950000000">
- <name>EDBR </name>
- <cmt>EDBR </cmt>
- <desc>EDBR </desc>
- </wpt>
-</gpx>
+++ /dev/null
-EDBX 51.158882 14.950277
-Horka,NOL(GM) 51.302700 14.902600
-RO(EDBR)-N 51.343624 14.952033
-EDBR 51.363167 14.950000
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="30.045500000" minlon="-91.610500000" maxlat="42.468666667" maxlon="-71.103000000"/>
- <wpt lat="42.438833333" lon="-71.119333333">
- <name>5066</name>
- <cmt>5066</cmt>
- <desc>5066</desc>
- </wpt>
- <wpt lat="42.439166667" lon="-71.119666667">
- <name>5067</name>
- <cmt>5067</cmt>
- <desc>5067</desc>
- </wpt>
- <wpt lat="42.439000000" lon="-71.116166667">
- <name>5096</name>
- <cmt>5096</cmt>
- <desc>5096</desc>
- </wpt>
- <wpt lat="42.443833333" lon="-71.122000000">
- <name>5142</name>
- <cmt>5142</cmt>
- <desc>5142</desc>
- </wpt>
- <wpt lat="42.447333333" lon="-71.121500000">
- <name>5156</name>
- <cmt>5156</cmt>
- <desc>5156</desc>
- </wpt>
- <wpt lat="42.454833333" lon="-71.125166667">
- <name>5224</name>
- <cmt>5224</cmt>
- <desc>5224</desc>
- </wpt>
- <wpt lat="42.459000000" lon="-71.125000000">
- <name>5229</name>
- <cmt>5229</cmt>
- <desc>5229</desc>
- </wpt>
- <wpt lat="42.457000000" lon="-71.124500000">
- <name>5237</name>
- <cmt>5237</cmt>
- <desc>5237</desc>
- </wpt>
- <wpt lat="42.454333333" lon="-71.121000000">
- <name>5254</name>
- <cmt>5254</cmt>
- <desc>5254</desc>
- </wpt>
- <wpt lat="42.451500000" lon="-71.121666667">
- <name>5258</name>
- <cmt>5258</cmt>
- <desc>5258</desc>
- </wpt>
- <wpt lat="42.454333333" lon="-71.120666667">
- <name>5264</name>
- <cmt>5264</cmt>
- <desc>5264</desc>
- </wpt>
- <wpt lat="42.457833333" lon="-71.121000000">
- <name>526708</name>
- <cmt>526708</cmt>
- <desc>526708</desc>
- </wpt>
- <wpt lat="42.457166667" lon="-71.120333333">
- <name>526750</name>
- <cmt>526750</cmt>
- <desc>526750</desc>
- </wpt>
- <wpt lat="42.456666667" lon="-71.119666667">
- <name>527614</name>
- <cmt>527614</cmt>
- <desc>527614</desc>
- </wpt>
- <wpt lat="42.456333333" lon="-71.119333333">
- <name>527631</name>
- <cmt>527631</cmt>
- <desc>527631</desc>
- </wpt>
- <wpt lat="42.458166667" lon="-71.119166667">
- <name>5278</name>
- <cmt>5278</cmt>
- <desc>5278</desc>
- </wpt>
- <wpt lat="42.459333333" lon="-71.117666667">
- <name>5289</name>
- <cmt>5289</cmt>
- <desc>5289</desc>
- </wpt>
- <wpt lat="42.464166667" lon="-71.119833333">
- <name>5374FIRE</name>
- <cmt>5374FIRE</cmt>
- <desc>5374FIRE</desc>
- </wpt>
- <wpt lat="42.465666667" lon="-71.119333333">
- <name>5376</name>
- <cmt>5376</cmt>
- <desc>5376</desc>
- </wpt>
- <wpt lat="42.439000000" lon="-71.114500000">
- <name>6006</name>
- <cmt>6006</cmt>
- <desc>6006</desc>
- </wpt>
- <wpt lat="42.438666667" lon="-71.114833333">
- <name>6006BLUE</name>
- <cmt>6006BLUE</cmt>
- <desc>6006BLUE</desc>
- </wpt>
- <wpt lat="42.436833333" lon="-71.113166667">
- <name>6014MEADW</name>
- <cmt>6014MEADW</cmt>
- <desc>6014MEADW</desc>
- </wpt>
- <wpt lat="42.441833333" lon="-71.113166667">
- <name>6029</name>
- <cmt>6029</cmt>
- <desc>6029</desc>
- </wpt>
- <wpt lat="42.436166667" lon="-71.109000000">
- <name>6053</name>
- <cmt>6053</cmt>
- <desc>6053</desc>
- </wpt>
- <wpt lat="42.439333333" lon="-71.107500000">
- <name>6066</name>
- <cmt>6066</cmt>
- <desc>6066</desc>
- </wpt>
- <wpt lat="42.439833333" lon="-71.107500000">
- <name>6067</name>
- <cmt>6067</cmt>
- <desc>6067</desc>
- </wpt>
- <wpt lat="42.434833333" lon="-71.105833333">
- <name>6071</name>
- <cmt>6071</cmt>
- <desc>6071</desc>
- </wpt>
- <wpt lat="42.433333333" lon="-71.106666667">
- <name>6073</name>
- <cmt>6073</cmt>
- <desc>6073</desc>
- </wpt>
- <wpt lat="42.437333333" lon="-71.104833333">
- <name>6084</name>
- <cmt>6084</cmt>
- <desc>6084</desc>
- </wpt>
- <wpt lat="42.442166667" lon="-71.111000000">
- <name>6130</name>
- <cmt>6130</cmt>
- <desc>6130</desc>
- </wpt>
- <wpt lat="42.443000000" lon="-71.111500000">
- <name>6131</name>
- <cmt>6131</cmt>
- <desc>6131</desc>
- </wpt>
- <wpt lat="42.444833333" lon="-71.108833333">
- <name>6153</name>
- <cmt>6153</cmt>
- <desc>6153</desc>
- </wpt>
- <wpt lat="42.443666667" lon="-71.106333333">
- <name>6171</name>
- <cmt>6171</cmt>
- <desc>6171</desc>
- </wpt>
- <wpt lat="42.447833333" lon="-71.106666667">
- <name>6176</name>
- <cmt>6176</cmt>
- <desc>6176</desc>
- </wpt>
- <wpt lat="42.448500000" lon="-71.106166667">
- <name>6177</name>
- <cmt>6177</cmt>
- <desc>6177</desc>
- </wpt>
- <wpt lat="42.453333333" lon="-71.106833333">
- <name>6272</name>
- <cmt>6272</cmt>
- <desc>6272</desc>
- </wpt>
- <wpt lat="42.453500000" lon="-71.107333333">
- <name>6272.1</name>
- <cmt>6272.1</cmt>
- <desc>6272.1</desc>
- </wpt>
- <wpt lat="42.458333333" lon="-71.106833333">
- <name>6278</name>
- <cmt>6278</cmt>
- <desc>6278</desc>
- </wpt>
- <wpt lat="42.451500000" lon="-71.105333333">
- <name>6280</name>
- <cmt>6280</cmt>
- <desc>6280</desc>
- </wpt>
- <wpt lat="42.453833333" lon="-71.105166667">
- <name>6283</name>
- <cmt>6283</cmt>
- <desc>6283</desc>
- </wpt>
- <wpt lat="42.460000000" lon="-71.106166667">
- <name>6289</name>
- <cmt>6289</cmt>
- <desc>6289</desc>
- </wpt>
- <wpt lat="42.457666667" lon="-71.105166667">
- <name>6297</name>
- <cmt>6297</cmt>
- <desc>6297</desc>
- </wpt>
- <wpt lat="42.467166667" lon="-71.113500000">
- <name>6328</name>
- <cmt>6328</cmt>
- <desc>6328</desc>
- </wpt>
- <wpt lat="42.464166667" lon="-71.109833333">
- <name>6354</name>
- <cmt>6354</cmt>
- <desc>6354</desc>
- </wpt>
- <wpt lat="42.466500000" lon="-71.110000000">
- <name>635722</name>
- <cmt>635722</cmt>
- <desc>635722</desc>
- </wpt>
- <wpt lat="42.466500000" lon="-71.109333333">
- <name>635783</name>
- <cmt>635783</cmt>
- <desc>635783</desc>
- </wpt>
- <wpt lat="42.463500000" lon="-71.107166667">
- <name>6373</name>
- <cmt>6373</cmt>
- <desc>6373</desc>
- </wpt>
- <wpt lat="42.401000000" lon="-71.110166667">
- <name>6634</name>
- <cmt>6634</cmt>
- <desc>6634</desc>
- </wpt>
- <wpt lat="42.432666667" lon="-71.106500000">
- <name>6979</name>
- <cmt>6979</cmt>
- <desc>6979</desc>
- </wpt>
- <wpt lat="42.431000000" lon="-71.107833333">
- <name>6997</name>
- <cmt>6997</cmt>
- <desc>6997</desc>
- </wpt>
- <wpt lat="42.465666667" lon="-71.107333333">
- <name>BEARHILL</name>
- <cmt>BEARHILL</cmt>
- <desc>BEARHILL</desc>
- </wpt>
- <wpt lat="42.431000000" lon="-71.107666667">
- <name>BELLEVUE</name>
- <cmt>BELLEVUE</cmt>
- <desc>BELLEVUE</desc>
- </wpt>
- <wpt lat="42.438666667" lon="-71.114000000">
- <name>6016</name>
- <cmt>6016</cmt>
- <desc>6016</desc>
- </wpt>
- <wpt lat="42.456500000" lon="-71.124666667">
- <name>5236BRIDG</name>
- <cmt>5236BRIDG</cmt>
- <desc>5236BRIDG</desc>
- </wpt>
- <wpt lat="42.465833333" lon="-71.119833333">
- <name>5376BRIDG</name>
- <cmt>5376BRIDG</cmt>
- <desc>5376BRIDG</desc>
- </wpt>
- <wpt lat="42.443000000" lon="-71.105833333">
- <name>6181CROSS</name>
- <cmt>6181CROSS</cmt>
- <desc>6181CROSS</desc>
- </wpt>
- <wpt lat="42.435500000" lon="-71.109666667">
- <name>6042CROSS</name>
- <cmt>6042CROSS</cmt>
- <desc>6042CROSS</desc>
- </wpt>
- <wpt lat="42.458500000" lon="-71.103666667">
- <name>DARKHOLLP</name>
- <cmt>DARKHOLLP</cmt>
- <desc>DARKHOLLP</desc>
- </wpt>
- <wpt lat="42.443166667" lon="-71.112666667">
- <name>6121DEAD</name>
- <cmt>6121DEAD</cmt>
- <desc>6121DEAD</desc>
- </wpt>
- <wpt lat="42.449833333" lon="-71.119333333">
- <name>5179DEAD</name>
- <cmt>5179DEAD</cmt>
- <desc>5179DEAD</desc>
- </wpt>
- <wpt lat="42.459666667" lon="-71.116500000">
- <name>5299DEAD</name>
- <cmt>5299DEAD</cmt>
- <desc>5299DEAD</desc>
- </wpt>
- <wpt lat="42.465500000" lon="-71.119166667">
- <name>5376DEAD</name>
- <cmt>5376DEAD</cmt>
- <desc>5376DEAD</desc>
- </wpt>
- <wpt lat="42.462833333" lon="-71.110000000">
- <name>6353DEAD</name>
- <cmt>6353DEAD</cmt>
- <desc>6353DEAD</desc>
- </wpt>
- <wpt lat="42.446833333" lon="-71.108833333">
- <name>6155DEAD</name>
- <cmt>6155DEAD</cmt>
- <desc>6155DEAD</desc>
- </wpt>
- <wpt lat="42.451166667" lon="-71.126666667">
- <name>GATE14</name>
- <cmt>GATE14</cmt>
- <desc>GATE14</desc>
- </wpt>
- <wpt lat="42.458500000" lon="-71.122000000">
- <name>GATE16</name>
- <cmt>GATE16</cmt>
- <desc>GATE16</desc>
- </wpt>
- <wpt lat="42.459333333" lon="-71.119166667">
- <name>GATE17</name>
- <cmt>GATE17</cmt>
- <desc>GATE17</desc>
- </wpt>
- <wpt lat="42.466333333" lon="-71.119166667">
- <name>GATE19</name>
- <cmt>GATE19</cmt>
- <desc>GATE19</desc>
- </wpt>
- <wpt lat="42.468666667" lon="-71.107666667">
- <name>GATE21</name>
- <cmt>GATE21</cmt>
- <desc>GATE21</desc>
- </wpt>
- <wpt lat="42.456666667" lon="-71.103000000">
- <name>GATE24</name>
- <cmt>GATE24</cmt>
- <desc>GATE24</desc>
- </wpt>
- <wpt lat="42.430833333" lon="-71.107666667">
- <name>GATE5</name>
- <cmt>GATE5</cmt>
- <desc>GATE5</desc>
- </wpt>
- <wpt lat="42.431166667" lon="-71.109166667">
- <name>GATE6</name>
- <cmt>GATE6</cmt>
- <desc>GATE6</desc>
- </wpt>
- <wpt lat="42.439500000" lon="-71.106500000">
- <name>6077LOGS</name>
- <cmt>6077LOGS</cmt>
- <desc>6077LOGS</desc>
- </wpt>
- <wpt lat="42.449833333" lon="-71.122333333">
- <name>5148NANEP</name>
- <cmt>5148NANEP</cmt>
- <desc>5148NANEP</desc>
- </wpt>
- <wpt lat="42.457333333" lon="-71.119833333">
- <name>5267OBSTC</name>
- <cmt>5267OBSTC</cmt>
- <desc>5267OBSTC</desc>
- </wpt>
- <wpt lat="42.435000000" lon="-71.110000000">
- <name>PANTHRCAV</name>
- <cmt>PANTHRCAV</cmt>
- <desc>PANTHRCAV</desc>
- </wpt>
- <wpt lat="42.453333333" lon="-71.121166667">
- <name>5252PURPL</name>
- <cmt>5252PURPL</cmt>
- <desc>5252PURPL</desc>
- </wpt>
- <wpt lat="42.457666667" lon="-71.117500000">
- <name>5287WATER</name>
- <cmt>5287WATER</cmt>
- <desc>5287WATER</desc>
- </wpt>
- <wpt lat="42.459333333" lon="-71.124500000">
- <name>5239ROAD</name>
- <cmt>5239ROAD</cmt>
- <desc>5239ROAD</desc>
- </wpt>
- <wpt lat="42.458833333" lon="-71.119000000">
- <name>5278ROAD</name>
- <cmt>5278ROAD</cmt>
- <desc>5278ROAD</desc>
- </wpt>
- <wpt lat="42.440000000" lon="-71.121000000">
- <name>5058ROAD</name>
- <cmt>5058ROAD</cmt>
- <desc>5058ROAD</desc>
- </wpt>
- <wpt lat="42.453333333" lon="-71.106833333">
- <name>SHEEPFOLD</name>
- <cmt>SHEEPFOLD</cmt>
- <desc>SHEEPFOLD</desc>
- </wpt>
- <wpt lat="42.456000000" lon="-71.107500000">
- <name>SOAPBOX</name>
- <cmt>SOAPBOX</cmt>
- <desc>SOAPBOX</desc>
- </wpt>
- <wpt lat="42.465833333" lon="-71.119333333">
- <name>5376STREM</name>
- <cmt>5376STREM</cmt>
- <desc>5376STREM</desc>
- </wpt>
- <wpt lat="42.445333333" lon="-71.122833333">
- <name>5144SUMMT</name>
- <cmt>5144SUMMT</cmt>
- <desc>5144SUMMT</desc>
- </wpt>
- <wpt lat="42.441666667" lon="-71.121666667">
- <name>5150TANK</name>
- <cmt>5150TANK</cmt>
- <desc>5150TANK</desc>
- </wpt>
- <rte>
- <number>1</number>
- <rtept lat="42.431000000" lon="-71.107666667">
- <name>BELLEVUE</name>
- </rtept>
- <rtept lat="42.431166667" lon="-71.109166667">
- <name>GATE6</name>
- </rtept>
- <rtept lat="42.435000000" lon="-71.110000000">
- <name>PANTHRCAV</name>
- </rtept>
- <rtept lat="42.436833333" lon="-71.113166667">
- <name>6014MEADW</name>
- </rtept>
- <rtept lat="42.439000000" lon="-71.114500000">
- <name>6006</name>
- </rtept>
- <rtept lat="42.438666667" lon="-71.114833333">
- <name>6006BLUE</name>
- </rtept>
- <rtept lat="42.439000000" lon="-71.116166667">
- <name>5096</name>
- </rtept>
- <rtept lat="42.438833333" lon="-71.119333333">
- <name>5066</name>
- </rtept>
- <rtept lat="42.439166667" lon="-71.119666667">
- <name>5067</name>
- </rtept>
- <rtept lat="42.440000000" lon="-71.121000000">
- <name>5058ROAD</name>
- </rtept>
- <rtept lat="42.441666667" lon="-71.121666667">
- <name>5150TANK</name>
- </rtept>
- <rtept lat="42.443833333" lon="-71.122000000">
- <name>5142</name>
- </rtept>
- <rtept lat="42.445333333" lon="-71.122833333">
- <name>5144SUMMT</name>
- </rtept>
- <rtept lat="42.447333333" lon="-71.121500000">
- <name>5156</name>
- </rtept>
- <rtept lat="42.449833333" lon="-71.122333333">
- <name>5148NANEP</name>
- </rtept>
- <rtept lat="42.451500000" lon="-71.121666667">
- <name>5258</name>
- </rtept>
- <rtept lat="42.453333333" lon="-71.121166667">
- <name>5252PURPL</name>
- </rtept>
- <rtept lat="42.456333333" lon="-71.119333333">
- <name>527631</name>
- </rtept>
- <rtept lat="42.456666667" lon="-71.119666667">
- <name>527614</name>
- </rtept>
- <rtept lat="42.457333333" lon="-71.119833333">
- <name>5267OBSTC</name>
- </rtept>
- <rtept lat="42.458166667" lon="-71.119166667">
- <name>5278</name>
- </rtept>
- <rtept lat="42.459333333" lon="-71.117666667">
- <name>5289</name>
- </rtept>
- <rtept lat="42.464166667" lon="-71.119833333">
- <name>5374FIRE</name>
- </rtept>
- <rtept lat="42.465666667" lon="-71.119333333">
- <name>5376</name>
- </rtept>
- <rtept lat="42.465833333" lon="-71.119333333">
- <name>5376STREM</name>
- </rtept>
- <rtept lat="42.467166667" lon="-71.113500000">
- <name>6328</name>
- </rtept>
- <rtept lat="42.466500000" lon="-71.110000000">
- <name>635722</name>
- </rtept>
- <rtept lat="42.466500000" lon="-71.109333333">
- <name>635783</name>
- </rtept>
- <rtept lat="42.463500000" lon="-71.107166667">
- <name>6373</name>
- </rtept>
- <rtept lat="42.465666667" lon="-71.107333333">
- <name>BEARHILL</name>
- </rtept>
- <rtept lat="42.460000000" lon="-71.106166667">
- <name>6289</name>
- </rtept>
- <rtept lat="42.457666667" lon="-71.105166667">
- <name>6297</name>
- </rtept>
- <rtept lat="42.453833333" lon="-71.105166667">
- <name>6283</name>
- </rtept>
- <rtept lat="42.451500000" lon="-71.105333333">
- <name>6280</name>
- </rtept>
- <rtept lat="42.448500000" lon="-71.106166667">
- <name>6177</name>
- </rtept>
- <rtept lat="42.447833333" lon="-71.106666667">
- <name>6176</name>
- </rtept>
- <rtept lat="42.444833333" lon="-71.108833333">
- <name>6153</name>
- </rtept>
- <rtept lat="42.443666667" lon="-71.106333333">
- <name>6171</name>
- </rtept>
- <rtept lat="42.443000000" lon="-71.111500000">
- <name>6131</name>
- </rtept>
- <rtept lat="42.442166667" lon="-71.111000000">
- <name>6130</name>
- </rtept>
- <rtept lat="42.441833333" lon="-71.113166667">
- <name>6029</name>
- </rtept>
- <rtept lat="42.439000000" lon="-71.114500000">
- <name>6006</name>
- </rtept>
- <rtept lat="42.436833333" lon="-71.113166667">
- <name>6014MEADW</name>
- </rtept>
- <rtept lat="42.435000000" lon="-71.110000000">
- <name>PANTHRCAV</name>
- </rtept>
- <rtept lat="42.431166667" lon="-71.109166667">
- <name>GATE6</name>
- </rtept>
- <rtept lat="42.431000000" lon="-71.107666667">
- <name>BELLEVUE</name>
- </rtept>
- </rte>
- <trk>
- <trkseg>
- <trkpt lat="30.062166667" lon="-91.610333333">
- <ele>0.914</ele>
- <time>2002-05-25T17:06:21Z</time>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="30.062833333" lon="-91.610500000">
- <ele>0.000</ele>
- <time>2002-05-25T17:09:55Z</time>
- <speed>0.329244</speed>
- </trkpt>
- <trkpt lat="30.062666667" lon="-91.608333333">
- <ele>0.000</ele>
- <time>2002-05-25T17:12:00Z</time>
- <speed>1.774833</speed>
- </trkpt>
- <trkpt lat="30.062333333" lon="-91.607333333">
- <ele>0.000</ele>
- <time>2002-05-25T17:12:48Z</time>
- <speed>1.970322</speed>
- </trkpt>
- <trkpt lat="30.061500000" lon="-91.605333333">
- <ele>0.000</ele>
- <time>2002-05-25T17:14:41Z</time>
- <speed>1.954889</speed>
- </trkpt>
- <trkpt lat="30.059833333" lon="-91.599333333">
- <ele>0.000</ele>
- <time>2002-05-25T17:17:16Z</time>
- <speed>3.868622</speed>
- </trkpt>
- <trkpt lat="30.057833333" lon="-91.596666667">
- <ele>0.000</ele>
- <time>2002-05-25T17:17:46Z</time>
- <speed>11.415523</speed>
- </trkpt>
- <trkpt lat="30.055333333" lon="-91.594833333">
- <ele>0.000</ele>
- <time>2002-05-25T17:18:20Z</time>
- <speed>9.388611</speed>
- </trkpt>
- <trkpt lat="30.053833333" lon="-91.592666667">
- <ele>0.000</ele>
- <time>2002-05-25T17:19:01Z</time>
- <speed>6.734078</speed>
- </trkpt>
- <trkpt lat="30.049666667" lon="-91.589833333">
- <ele>0.000</ele>
- <time>2002-05-25T17:20:46Z</time>
- <speed>5.123867</speed>
- </trkpt>
- <trkpt lat="30.049000000" lon="-91.589833333">
- <ele>0.000</ele>
- <time>2002-05-25T17:21:10Z</time>
- <speed>3.364467</speed>
- </trkpt>
- <trkpt lat="30.048833333" lon="-91.593000000">
- <ele>0.000</ele>
- <time>2002-05-25T17:21:51Z</time>
- <speed>7.191933</speed>
- </trkpt>
- <trkpt lat="30.046166667" lon="-91.596500000">
- <ele>0.000</ele>
- <time>2002-05-25T17:22:35Z</time>
- <speed>10.072823</speed>
- </trkpt>
- <trkpt lat="30.045500000" lon="-91.598666667">
- <ele>0.000</ele>
- <time>2002-05-25T17:23:08Z</time>
- <speed>7.047889</speed>
- </trkpt>
- <trkpt lat="30.047333333" lon="-91.600333333">
- <ele>0.000</ele>
- <time>2002-05-25T18:04:23Z</time>
- <speed>0.102889</speed>
- </trkpt>
- <trkpt lat="30.047000000" lon="-91.599666667">
- <ele>2.134</ele>
- <time>2002-05-25T18:06:04Z</time>
- <speed>0.689356</speed>
- </trkpt>
- <trkpt lat="30.046500000" lon="-91.599500000">
- <ele>0.000</ele>
- <time>2002-05-25T18:07:06Z</time>
- <speed>1.049467</speed>
- </trkpt>
- <trkpt lat="30.046166667" lon="-91.599000000">
- <ele>0.914</ele>
- <time>2002-05-25T18:08:18Z</time>
- <speed>0.781956</speed>
- </trkpt>
- <trkpt lat="30.046333333" lon="-91.597666667">
- <ele>0.000</ele>
- <time>2002-05-25T18:10:20Z</time>
- <speed>0.972300</speed>
- </trkpt>
- <trkpt lat="30.046333333" lon="-91.597166667">
- <ele>0.000</ele>
- <time>2002-05-25T18:11:09Z</time>
- <speed>1.111200</speed>
- </trkpt>
- <trkpt lat="30.046833333" lon="-91.596333333">
- <ele>0.000</ele>
- <time>2002-05-25T18:12:18Z</time>
- <speed>1.358133</speed>
- </trkpt>
- <trkpt lat="30.047500000" lon="-91.595166667">
- <ele>0.000</ele>
- <time>2002-05-25T18:14:22Z</time>
- <speed>1.064900</speed>
- </trkpt>
- <trkpt lat="30.047833333" lon="-91.594833333">
- <ele>2.134</ele>
- <time>2002-05-25T18:15:04Z</time>
- <speed>1.358133</speed>
- </trkpt>
- <trkpt lat="30.048166667" lon="-91.594000000">
- <ele>0.914</ele>
- <time>2002-05-25T18:16:14Z</time>
- <speed>1.183222</speed>
- </trkpt>
- <trkpt lat="30.048666667" lon="-91.593833333">
- <ele>0.914</ele>
- <time>2002-05-25T18:17:01Z</time>
- <speed>1.178078</speed>
- </trkpt>
- <trkpt lat="30.049333333" lon="-91.593833333">
- <ele>0.000</ele>
- <time>2002-05-25T18:18:07Z</time>
- <speed>1.126633</speed>
- </trkpt>
- <trkpt lat="30.050333333" lon="-91.594000000">
- <ele>2.134</ele>
- <time>2002-05-25T18:19:51Z</time>
- <speed>1.044322</speed>
- </trkpt>
- <trkpt lat="30.050833333" lon="-91.594166667">
- <ele>0.000</ele>
- <time>2002-05-25T18:20:39Z</time>
- <speed>1.111200</speed>
- </trkpt>
- <trkpt lat="30.051166667" lon="-91.594333333">
- <ele>0.000</ele>
- <time>2002-05-25T18:21:24Z</time>
- <speed>1.234667</speed>
- </trkpt>
- <trkpt lat="30.051833333" lon="-91.594333333">
- <ele>0.000</ele>
- <time>2002-05-25T18:22:17Z</time>
- <speed>1.188367</speed>
- </trkpt>
- <trkpt lat="30.052166667" lon="-91.594666667">
- <ele>0.000</ele>
- <time>2002-05-25T18:23:18Z</time>
- <speed>0.895133</speed>
- </trkpt>
- <trkpt lat="30.053000000" lon="-91.594666667">
- <ele>0.000</ele>
- <time>2002-05-25T18:24:37Z</time>
- <speed>1.126633</speed>
- </trkpt>
- <trkpt lat="30.054833333" lon="-91.595166667">
- <ele>6.096</ele>
- <time>2002-05-25T18:28:13Z</time>
- <speed>0.982589</speed>
- </trkpt>
- <trkpt lat="30.053666667" lon="-91.595000000">
- <ele>2.134</ele>
- <time>2002-05-25T18:31:36Z</time>
- <speed>0.632767</speed>
- </trkpt>
- <trkpt lat="30.053166667" lon="-91.594833333">
- <ele>0.000</ele>
- <time>2002-05-25T18:32:56Z</time>
- <speed>0.787100</speed>
- </trkpt>
- <trkpt lat="30.052666667" lon="-91.594833333">
- <ele>0.000</ele>
- <time>2002-05-25T18:34:02Z</time>
- <speed>0.931144</speed>
- </trkpt>
- <trkpt lat="30.052500000" lon="-91.595500000">
- <ele>0.000</ele>
- <time>2002-05-25T18:36:03Z</time>
- <speed>0.504156</speed>
- </trkpt>
- <trkpt lat="30.052500000" lon="-91.596000000">
- <ele>0.000</ele>
- <time>2002-05-25T18:36:48Z</time>
- <speed>1.147211</speed>
- </trkpt>
- <trkpt lat="30.052666667" lon="-91.596833333">
- <ele>0.914</ele>
- <time>2002-05-25T18:37:52Z</time>
- <speed>1.260389</speed>
- </trkpt>
- <trkpt lat="30.053166667" lon="-91.597833333">
- <ele>0.000</ele>
- <time>2002-05-25T18:39:18Z</time>
- <speed>1.347844</speed>
- </trkpt>
- <trkpt lat="30.053666667" lon="-91.598000000">
- <ele>0.000</ele>
- <time>2002-05-25T18:40:15Z</time>
- <speed>0.967156</speed>
- </trkpt>
- <trkpt lat="30.054000000" lon="-91.597833333">
- <ele>6.096</ele>
- <time>2002-05-25T18:41:25Z</time>
- <speed>0.622478</speed>
- </trkpt>
- <trkpt lat="30.053666667" lon="-91.598000000">
- <ele>0.000</ele>
- <time>2002-05-25T18:42:37Z</time>
- <speed>0.684211</speed>
- </trkpt>
- <trkpt lat="30.053166667" lon="-91.598000000">
- <ele>0.000</ele>
- <time>2002-05-25T18:44:01Z</time>
- <speed>0.586467</speed>
- </trkpt>
- <trkpt lat="30.052833333" lon="-91.597500000">
- <ele>0.000</ele>
- <time>2002-05-25T18:45:53Z</time>
- <speed>0.514444</speed>
- </trkpt>
- <trkpt lat="30.052500000" lon="-91.597000000">
- <ele>0.000</ele>
- <time>2002-05-25T18:46:54Z</time>
- <speed>1.028889</speed>
- </trkpt>
- <trkpt lat="30.052333333" lon="-91.596500000">
- <ele>0.000</ele>
- <time>2002-05-25T18:47:42Z</time>
- <speed>1.142067</speed>
- </trkpt>
- <trkpt lat="30.052333333" lon="-91.595666667">
- <ele>0.000</ele>
- <time>2002-05-25T18:48:41Z</time>
- <speed>1.234667</speed>
- </trkpt>
- <trkpt lat="30.052166667" lon="-91.595000000">
- <ele>0.000</ele>
- <time>2002-05-25T18:49:52Z</time>
- <speed>0.905422</speed>
- </trkpt>
- <trkpt lat="30.051833333" lon="-91.594666667">
- <ele>0.000</ele>
- <time>2002-05-25T18:50:49Z</time>
- <speed>0.843689</speed>
- </trkpt>
- <trkpt lat="30.051000000" lon="-91.594333333">
- <ele>0.000</ele>
- <time>2002-05-25T18:52:14Z</time>
- <speed>1.142067</speed>
- </trkpt>
- <trkpt lat="30.050500000" lon="-91.594166667">
- <ele>0.000</ele>
- <time>2002-05-25T18:52:56Z</time>
- <speed>1.337556</speed>
- </trkpt>
- <trkpt lat="30.050166667" lon="-91.594166667">
- <ele>0.000</ele>
- <time>2002-05-25T18:53:38Z</time>
- <speed>1.064900</speed>
- </trkpt>
- <trkpt lat="30.049166667" lon="-91.593666667">
- <ele>0.000</ele>
- <time>2002-05-25T18:55:11Z</time>
- <speed>1.358133</speed>
- </trkpt>
- <trkpt lat="30.048500000" lon="-91.594333333">
- <ele>0.000</ele>
- <time>2002-05-25T18:56:32Z</time>
- <speed>1.095767</speed>
- </trkpt>
- <trkpt lat="30.048000000" lon="-91.594666667">
- <ele>0.000</ele>
- <time>2002-05-25T18:57:24Z</time>
- <speed>1.214089</speed>
- </trkpt>
- <trkpt lat="30.047500000" lon="-91.595500000">
- <ele>7.010</ele>
- <time>2002-05-25T18:58:40Z</time>
- <speed>1.229522</speed>
- </trkpt>
- <trkpt lat="30.047000000" lon="-91.596000000">
- <ele>0.000</ele>
- <time>2002-05-25T18:59:28Z</time>
- <speed>1.491889</speed>
- </trkpt>
- <trkpt lat="30.046666667" lon="-91.596666667">
- <ele>0.000</ele>
- <time>2002-05-25T19:00:22Z</time>
- <speed>1.394144</speed>
- </trkpt>
- <trkpt lat="30.046333333" lon="-91.597666667">
- <ele>0.000</ele>
- <time>2002-05-25T19:01:41Z</time>
- <speed>1.322122</speed>
- </trkpt>
- <trkpt lat="30.046166667" lon="-91.598500000">
- <ele>0.000</ele>
- <time>2002-05-25T19:02:48Z</time>
- <speed>1.208944</speed>
- </trkpt>
- <trkpt lat="30.046333333" lon="-91.599000000">
- <ele>0.000</ele>
- <time>2002-05-25T19:03:43Z</time>
- <speed>0.889989</speed>
- </trkpt>
- <trkpt lat="30.046833333" lon="-91.599333333">
- <ele>0.000</ele>
- <time>2002-05-25T19:04:49Z</time>
- <speed>0.910567</speed>
- </trkpt>
- <trkpt lat="30.047166667" lon="-91.599666667">
- <ele>0.000</ele>
- <time>2002-05-25T19:05:57Z</time>
- <speed>0.792244</speed>
- </trkpt>
- </trkseg>
- </trk>
-</gpx>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="42.401000000" minlon="-71.126666667" maxlat="42.468666667" maxlon="-71.103000000"/>
- <wpt lat="42.438833333" lon="-71.119333333">
- <name>5066</name>
- <cmt>5066</cmt>
- <desc>5066</desc>
- </wpt>
- <wpt lat="42.439166667" lon="-71.119666667">
- <name>5067</name>
- <cmt>5067</cmt>
- <desc>5067</desc>
- </wpt>
- <wpt lat="42.439000000" lon="-71.116166667">
- <name>5096</name>
- <cmt>5096</cmt>
- <desc>5096</desc>
- </wpt>
- <wpt lat="42.443833333" lon="-71.122000000">
- <name>5142</name>
- <cmt>5142</cmt>
- <desc>5142</desc>
- </wpt>
- <wpt lat="42.447333333" lon="-71.121500000">
- <name>5156</name>
- <cmt>5156</cmt>
- <desc>5156</desc>
- </wpt>
- <wpt lat="42.454833333" lon="-71.125166667">
- <name>5224</name>
- <cmt>5224</cmt>
- <desc>5224</desc>
- </wpt>
- <wpt lat="42.459000000" lon="-71.125000000">
- <name>5229</name>
- <cmt>5229</cmt>
- <desc>5229</desc>
- </wpt>
- <wpt lat="42.457000000" lon="-71.124500000">
- <name>5237</name>
- <cmt>5237</cmt>
- <desc>5237</desc>
- </wpt>
- <wpt lat="42.454333333" lon="-71.121000000">
- <name>5254</name>
- <cmt>5254</cmt>
- <desc>5254</desc>
- </wpt>
- <wpt lat="42.451500000" lon="-71.121666667">
- <name>5258</name>
- <cmt>5258</cmt>
- <desc>5258</desc>
- </wpt>
- <wpt lat="42.454333333" lon="-71.120666667">
- <name>5264</name>
- <cmt>5264</cmt>
- <desc>5264</desc>
- </wpt>
- <wpt lat="42.457833333" lon="-71.121000000">
- <name>526708</name>
- <cmt>526708</cmt>
- <desc>526708</desc>
- </wpt>
- <wpt lat="42.457166667" lon="-71.120333333">
- <name>526750</name>
- <cmt>526750</cmt>
- <desc>526750</desc>
- </wpt>
- <wpt lat="42.456666667" lon="-71.119666667">
- <name>527614</name>
- <cmt>527614</cmt>
- <desc>527614</desc>
- </wpt>
- <wpt lat="42.456333333" lon="-71.119333333">
- <name>527631</name>
- <cmt>527631</cmt>
- <desc>527631</desc>
- </wpt>
- <wpt lat="42.458166667" lon="-71.119166667">
- <name>5278</name>
- <cmt>5278</cmt>
- <desc>5278</desc>
- </wpt>
- <wpt lat="42.459333333" lon="-71.117666667">
- <name>5289</name>
- <cmt>5289</cmt>
- <desc>5289</desc>
- </wpt>
- <wpt lat="42.464166667" lon="-71.119833333">
- <name>5374FIRE</name>
- <cmt>5374FIRE</cmt>
- <desc>5374FIRE</desc>
- </wpt>
- <wpt lat="42.465666667" lon="-71.119333333">
- <name>5376</name>
- <cmt>5376</cmt>
- <desc>5376</desc>
- </wpt>
- <wpt lat="42.439000000" lon="-71.114500000">
- <name>6006</name>
- <cmt>6006</cmt>
- <desc>6006</desc>
- </wpt>
- <wpt lat="42.438666667" lon="-71.114833333">
- <name>6006BLUE</name>
- <cmt>6006BLUE</cmt>
- <desc>6006BLUE</desc>
- </wpt>
- <wpt lat="42.436833333" lon="-71.113166667">
- <name>6014MEADW</name>
- <cmt>6014MEADW</cmt>
- <desc>6014MEADW</desc>
- </wpt>
- <wpt lat="42.441833333" lon="-71.113166667">
- <name>6029</name>
- <cmt>6029</cmt>
- <desc>6029</desc>
- </wpt>
- <wpt lat="42.436166667" lon="-71.109000000">
- <name>6053</name>
- <cmt>6053</cmt>
- <desc>6053</desc>
- </wpt>
- <wpt lat="42.439333333" lon="-71.107500000">
- <name>6066</name>
- <cmt>6066</cmt>
- <desc>6066</desc>
- </wpt>
- <wpt lat="42.439833333" lon="-71.107500000">
- <name>6067</name>
- <cmt>6067</cmt>
- <desc>6067</desc>
- </wpt>
- <wpt lat="42.434833333" lon="-71.105833333">
- <name>6071</name>
- <cmt>6071</cmt>
- <desc>6071</desc>
- </wpt>
- <wpt lat="42.433333333" lon="-71.106666667">
- <name>6073</name>
- <cmt>6073</cmt>
- <desc>6073</desc>
- </wpt>
- <wpt lat="42.437333333" lon="-71.104833333">
- <name>6084</name>
- <cmt>6084</cmt>
- <desc>6084</desc>
- </wpt>
- <wpt lat="42.442166667" lon="-71.111000000">
- <name>6130</name>
- <cmt>6130</cmt>
- <desc>6130</desc>
- </wpt>
- <wpt lat="42.443000000" lon="-71.111500000">
- <name>6131</name>
- <cmt>6131</cmt>
- <desc>6131</desc>
- </wpt>
- <wpt lat="42.444833333" lon="-71.108833333">
- <name>6153</name>
- <cmt>6153</cmt>
- <desc>6153</desc>
- </wpt>
- <wpt lat="42.443666667" lon="-71.106333333">
- <name>6171</name>
- <cmt>6171</cmt>
- <desc>6171</desc>
- </wpt>
- <wpt lat="42.447833333" lon="-71.106666667">
- <name>6176</name>
- <cmt>6176</cmt>
- <desc>6176</desc>
- </wpt>
- <wpt lat="42.448500000" lon="-71.106166667">
- <name>6177</name>
- <cmt>6177</cmt>
- <desc>6177</desc>
- </wpt>
- <wpt lat="42.453333333" lon="-71.106833333">
- <name>6272</name>
- <cmt>6272</cmt>
- <desc>6272</desc>
- </wpt>
- <wpt lat="42.453500000" lon="-71.107333333">
- <name>6272.1</name>
- <cmt>6272.1</cmt>
- <desc>6272.1</desc>
- </wpt>
- <wpt lat="42.458333333" lon="-71.106833333">
- <name>6278</name>
- <cmt>6278</cmt>
- <desc>6278</desc>
- </wpt>
- <wpt lat="42.451500000" lon="-71.105333333">
- <name>6280</name>
- <cmt>6280</cmt>
- <desc>6280</desc>
- </wpt>
- <wpt lat="42.453833333" lon="-71.105166667">
- <name>6283</name>
- <cmt>6283</cmt>
- <desc>6283</desc>
- </wpt>
- <wpt lat="42.460000000" lon="-71.106166667">
- <name>6289</name>
- <cmt>6289</cmt>
- <desc>6289</desc>
- </wpt>
- <wpt lat="42.457666667" lon="-71.105166667">
- <name>6297</name>
- <cmt>6297</cmt>
- <desc>6297</desc>
- </wpt>
- <wpt lat="42.467166667" lon="-71.113500000">
- <name>6328</name>
- <cmt>6328</cmt>
- <desc>6328</desc>
- </wpt>
- <wpt lat="42.464166667" lon="-71.109833333">
- <name>6354</name>
- <cmt>6354</cmt>
- <desc>6354</desc>
- </wpt>
- <wpt lat="42.466500000" lon="-71.110000000">
- <name>635722</name>
- <cmt>635722</cmt>
- <desc>635722</desc>
- </wpt>
- <wpt lat="42.466500000" lon="-71.109333333">
- <name>635783</name>
- <cmt>635783</cmt>
- <desc>635783</desc>
- </wpt>
- <wpt lat="42.463500000" lon="-71.107166667">
- <name>6373</name>
- <cmt>6373</cmt>
- <desc>6373</desc>
- </wpt>
- <wpt lat="42.401000000" lon="-71.110166667">
- <name>6634</name>
- <cmt>6634</cmt>
- <desc>6634</desc>
- </wpt>
- <wpt lat="42.432666667" lon="-71.106500000">
- <name>6979</name>
- <cmt>6979</cmt>
- <desc>6979</desc>
- </wpt>
- <wpt lat="42.431000000" lon="-71.107833333">
- <name>6997</name>
- <cmt>6997</cmt>
- <desc>6997</desc>
- </wpt>
- <wpt lat="42.465666667" lon="-71.107333333">
- <name>BEARHILL</name>
- <cmt>BEARHILL</cmt>
- <desc>BEARHILL</desc>
- </wpt>
- <wpt lat="42.431000000" lon="-71.107666667">
- <name>BELLEVUE</name>
- <cmt>BELLEVUE</cmt>
- <desc>BELLEVUE</desc>
- </wpt>
- <wpt lat="42.438666667" lon="-71.114000000">
- <name>6016</name>
- <cmt>6016</cmt>
- <desc>6016</desc>
- </wpt>
- <wpt lat="42.456500000" lon="-71.124666667">
- <name>5236BRIDG</name>
- <cmt>5236BRIDG</cmt>
- <desc>5236BRIDG</desc>
- </wpt>
- <wpt lat="42.465833333" lon="-71.119833333">
- <name>5376BRIDG</name>
- <cmt>5376BRIDG</cmt>
- <desc>5376BRIDG</desc>
- </wpt>
- <wpt lat="42.443000000" lon="-71.105833333">
- <name>6181CROSS</name>
- <cmt>6181CROSS</cmt>
- <desc>6181CROSS</desc>
- </wpt>
- <wpt lat="42.435500000" lon="-71.109666667">
- <name>6042CROSS</name>
- <cmt>6042CROSS</cmt>
- <desc>6042CROSS</desc>
- </wpt>
- <wpt lat="42.458500000" lon="-71.103666667">
- <name>DARKHOLLP</name>
- <cmt>DARKHOLLP</cmt>
- <desc>DARKHOLLP</desc>
- </wpt>
- <wpt lat="42.443166667" lon="-71.112666667">
- <name>6121DEAD</name>
- <cmt>6121DEAD</cmt>
- <desc>6121DEAD</desc>
- </wpt>
- <wpt lat="42.449833333" lon="-71.119333333">
- <name>5179DEAD</name>
- <cmt>5179DEAD</cmt>
- <desc>5179DEAD</desc>
- </wpt>
- <wpt lat="42.459666667" lon="-71.116500000">
- <name>5299DEAD</name>
- <cmt>5299DEAD</cmt>
- <desc>5299DEAD</desc>
- </wpt>
- <wpt lat="42.465500000" lon="-71.119166667">
- <name>5376DEAD</name>
- <cmt>5376DEAD</cmt>
- <desc>5376DEAD</desc>
- </wpt>
- <wpt lat="42.462833333" lon="-71.110000000">
- <name>6353DEAD</name>
- <cmt>6353DEAD</cmt>
- <desc>6353DEAD</desc>
- </wpt>
- <wpt lat="42.446833333" lon="-71.108833333">
- <name>6155DEAD</name>
- <cmt>6155DEAD</cmt>
- <desc>6155DEAD</desc>
- </wpt>
- <wpt lat="42.451166667" lon="-71.126666667">
- <name>GATE14</name>
- <cmt>GATE14</cmt>
- <desc>GATE14</desc>
- </wpt>
- <wpt lat="42.458500000" lon="-71.122000000">
- <name>GATE16</name>
- <cmt>GATE16</cmt>
- <desc>GATE16</desc>
- </wpt>
- <wpt lat="42.459333333" lon="-71.119166667">
- <name>GATE17</name>
- <cmt>GATE17</cmt>
- <desc>GATE17</desc>
- </wpt>
- <wpt lat="42.466333333" lon="-71.119166667">
- <name>GATE19</name>
- <cmt>GATE19</cmt>
- <desc>GATE19</desc>
- </wpt>
- <wpt lat="42.468666667" lon="-71.107666667">
- <name>GATE21</name>
- <cmt>GATE21</cmt>
- <desc>GATE21</desc>
- </wpt>
- <wpt lat="42.456666667" lon="-71.103000000">
- <name>GATE24</name>
- <cmt>GATE24</cmt>
- <desc>GATE24</desc>
- </wpt>
- <wpt lat="42.430833333" lon="-71.107666667">
- <name>GATE5</name>
- <cmt>GATE5</cmt>
- <desc>GATE5</desc>
- </wpt>
- <wpt lat="42.431166667" lon="-71.109166667">
- <name>GATE6</name>
- <cmt>GATE6</cmt>
- <desc>GATE6</desc>
- </wpt>
- <wpt lat="42.439500000" lon="-71.106500000">
- <name>6077LOGS</name>
- <cmt>6077LOGS</cmt>
- <desc>6077LOGS</desc>
- </wpt>
- <wpt lat="42.449833333" lon="-71.122333333">
- <name>5148NANEP</name>
- <cmt>5148NANEP</cmt>
- <desc>5148NANEP</desc>
- </wpt>
- <wpt lat="42.457333333" lon="-71.119833333">
- <name>5267OBSTC</name>
- <cmt>5267OBSTC</cmt>
- <desc>5267OBSTC</desc>
- </wpt>
- <wpt lat="42.435000000" lon="-71.110000000">
- <name>PANTHRCAV</name>
- <cmt>PANTHRCAV</cmt>
- <desc>PANTHRCAV</desc>
- </wpt>
- <wpt lat="42.453333333" lon="-71.121166667">
- <name>5252PURPL</name>
- <cmt>5252PURPL</cmt>
- <desc>5252PURPL</desc>
- </wpt>
- <wpt lat="42.457666667" lon="-71.117500000">
- <name>5287WATER</name>
- <cmt>5287WATER</cmt>
- <desc>5287WATER</desc>
- </wpt>
- <wpt lat="42.459333333" lon="-71.124500000">
- <name>5239ROAD</name>
- <cmt>5239ROAD</cmt>
- <desc>5239ROAD</desc>
- </wpt>
- <wpt lat="42.458833333" lon="-71.119000000">
- <name>5278ROAD</name>
- <cmt>5278ROAD</cmt>
- <desc>5278ROAD</desc>
- </wpt>
- <wpt lat="42.440000000" lon="-71.121000000">
- <name>5058ROAD</name>
- <cmt>5058ROAD</cmt>
- <desc>5058ROAD</desc>
- </wpt>
- <wpt lat="42.453333333" lon="-71.106833333">
- <name>SHEEPFOLD</name>
- <cmt>SHEEPFOLD</cmt>
- <desc>SHEEPFOLD</desc>
- </wpt>
- <wpt lat="42.456000000" lon="-71.107500000">
- <name>SOAPBOX</name>
- <cmt>SOAPBOX</cmt>
- <desc>SOAPBOX</desc>
- </wpt>
- <wpt lat="42.465833333" lon="-71.119333333">
- <name>5376STREM</name>
- <cmt>5376STREM</cmt>
- <desc>5376STREM</desc>
- </wpt>
- <wpt lat="42.445333333" lon="-71.122833333">
- <name>5144SUMMT</name>
- <cmt>5144SUMMT</cmt>
- <desc>5144SUMMT</desc>
- </wpt>
- <wpt lat="42.441666667" lon="-71.121666667">
- <name>5150TANK</name>
- <cmt>5150TANK</cmt>
- <desc>5150TANK</desc>
- </wpt>
-</gpx>
+++ /dev/null
-W 001 5066 N4226.33 W07107.16
-W 002 5067 N4226.35 W07107.18
-W 003 5096 N4226.34 W07106.97
-W 004 5142 N4226.63 W07107.32
-W 005 5156 N4226.84 W07107.29
-W 006 5224 N4227.29 W07107.51
-W 007 5229 N4227.54 W07107.50
-W 008 5237 N4227.42 W07107.47
-W 009 5254 N4227.26 W07107.26
-W 010 5258 N4227.09 W07107.30
-W 011 5264 N4227.26 W07107.24
-W 012 526708 N4227.47 W07107.26
-W 013 526750 N4227.43 W07107.22
-W 014 527614 N4227.40 W07107.18
-W 015 527631 N4227.38 W07107.16
-W 016 5278 N4227.49 W07107.15
-W 017 5289 N4227.56 W07107.06
-W 018 5374FIRE N4227.85 W07107.19
-W 019 5376 N4227.94 W07107.16
-W 020 6006 N4226.34 W07106.87
-W 021 6006BLUE N4226.32 W07106.89
-W 022 6014MEADW N4226.21 W07106.79
-W 023 6029 N4226.51 W07106.79
-W 024 6053 N4226.17 W07106.54
-W 025 6066 N4226.36 W07106.45
-W 026 6067 N4226.39 W07106.45
-W 027 6071 N4226.09 W07106.35
-W 028 6073 N4226.00 W07106.40
-W 029 6084 N4226.24 W07106.29
-W 030 6130 N4226.53 W07106.66
-W 031 6131 N4226.58 W07106.69
-W 032 6153 N4226.69 W07106.53
-W 033 6171 N4226.62 W07106.38
-W 034 6176 N4226.87 W07106.40
-W 035 6177 N4226.91 W07106.37
-W 036 6272 N4227.20 W07106.41
-W 037 6272.1 N4227.21 W07106.44
-W 038 6278 N4227.50 W07106.41
-W 039 6280 N4227.09 W07106.32
-W 040 6283 N4227.23 W07106.31
-W 041 6289 N4227.60 W07106.37
-W 042 6297 N4227.46 W07106.31
-W 043 6328 N4228.03 W07106.81
-W 044 6354 N4227.85 W07106.59
-W 045 635722 N4227.99 W07106.60
-W 046 635783 N4227.99 W07106.56
-W 047 6373 N4227.81 W07106.43
-W 048 6634 N4224.06 W07106.61
-W 049 6979 N4225.96 W07106.39
-W 050 6997 N4225.86 W07106.47
-W 051 BEARHILL N4227.94 W07106.44
-W 052 BELLEVUE N4225.86 W07106.46
-W 053 6016 N4226.32 W07106.84
-W 054 5236BRIDG N4227.39 W07107.48
-W 055 5376BRIDG N4227.95 W07107.19
-W 056 6181CROSS N4226.58 W07106.35
-W 057 6042CROSS N4226.13 W07106.58
-W 058 DARKHOLLP N4227.51 W07106.22
-W 059 6121DEAD N4226.59 W07106.76
-W 060 5179DEAD N4226.99 W07107.16
-W 061 5299DEAD N4227.58 W07106.99
-W 062 5376DEAD N4227.93 W07107.15
-W 063 6353DEAD N4227.77 W07106.60
-W 064 6155DEAD N4226.81 W07106.53
-W 065 GATE14 N4227.07 W07107.60
-W 066 GATE16 N4227.51 W07107.32
-W 067 GATE17 N4227.56 W07107.15
-W 068 GATE19 N4227.98 W07107.15
-W 069 GATE21 N4228.12 W07106.46
-W 070 GATE24 N4227.40 W07106.18
-W 071 GATE5 N4225.85 W07106.46
-W 072 GATE6 N4225.87 W07106.55
-W 073 6077LOGS N4226.37 W07106.39
-W 074 5148NANEP N4226.99 W07107.34
-W 075 5267OBSTC N4227.44 W07107.19
-W 076 PANTHRCAV N4226.10 W07106.60
-W 077 5252PURPL N4227.20 W07107.27
-W 078 5287WATER N4227.46 W07107.05
-W 079 5239ROAD N4227.56 W07107.47
-W 080 5278ROAD N4227.53 W07107.14
-W 081 5058ROAD N4226.40 W07107.26
-W 082 SHEEPFOLD N4227.20 W07106.41
-W 083 SOAPBOX N4227.36 W07106.45
-W 084 5376STREM N4227.95 W07107.16
-W 085 5144SUMMT N4226.72 W07107.37
-W 086 5150TANK N4226.50 W07107.30
+++ /dev/null
-Grid Lat/Lon hddd°mm.mmm'\r
-Datum WGS 84\r
-\r
-Header Name Description Type Position Altitude Depth Proximity Temperature Display Mode Color Symbol Facility City State Country Date Modified Link Categories\r
-\r
-Waypoint 001 User Waypoint N50 29.56 E12 06.33 0 m Symbol & Name Unknown Waypoint \r
-Waypoint 002 User Waypoint N50 29.56 E12 06.33 0 m Symbol & Name Unknown Waypoint \r
-Waypoint 003 User Waypoint N50 29.66 E12 06.31 0 m Symbol & Name Unknown Waypoint \r
-Waypoint 004 User Waypoint N50 29.63 E12 06.37 0 m Symbol & Name Unknown Waypoint \r
-Waypoint 005 User Waypoint N50 29.63 E12 06.37 0 m Symbol & Name Unknown Waypoint \r
-Waypoint 006 User Waypoint N50 29.60 E12 06.43 0 m Symbol & Name Unknown Waypoint \r
-Waypoint 007 User Waypoint N50 29.62 E12 06.43 0 m Symbol & Name Unknown Waypoint \r
-Waypoint Jahnstrasse User Waypoint N50 29.62 E12 06.43 0 m Symbol & Name Unknown Waypoint \r
-Waypoint Liebknechtstrasse User Waypoint N50 29.63 E12 06.37 0 m Symbol & Name Unknown Waypoint \r
-Waypoint NARVA User Waypoint N50 29.56 E12 06.33 391 m Symbol & Name Unknown Waypoint \r
-\r
-\r
-Header Name Length Course Waypoints Link\r
-\r
-Route 394 m 46° true 10 waypoints \r
-\r
-Header Waypoint Name Distance Leg Length Course\r
-\r
-Route Waypoint NARVA 0 m\r
-Route Waypoint 001 2 m 2 m 221° true\r
-Route Waypoint 002 2 m 0 m 0° true\r
-Route Waypoint 003 189 m 188 m 353° true\r
-Route Waypoint 004 274 m 85 m 126° true\r
-Route Waypoint Liebknechtstrasse 274 m 0 m 299° true\r
-Route Waypoint 005 274 m 0 m 119° true\r
-Route Waypoint 006 361 m 88 m 126° true\r
-Route Waypoint 007 393 m 32 m 6° true\r
-Route Waypoint Jahnstrasse 394 m 1 m 351° true\r
-\r
-\r
-Header Name Start Time Elapsed Time Length Average Speed Link\r
-\r
-Track ACTIVE LOG 006 01/05/2005 15:02:47 0:33:09 653 m 1.2 kph \r
-\r
-Header Position Time Altitude Depth Temperature Leg Length Leg Time Leg Speed Leg Course\r
-\r
-Trackpoint N51 18.78 E12 24.79 01/05/2005 15:02:47 161 m \r
-Trackpoint N51 18.77 E12 24.79 01/05/2005 15:03:25 154 m 8 m 0:00:38 0.8 kph 137° true\r
-Trackpoint N51 18.77 E12 24.79 01/05/2005 15:03:39 148 m 3 m 0:00:14 0.8 kph 180° true\r
-Trackpoint N51 18.77 E12 24.80 01/05/2005 15:04:16 139 m 5 m 0:00:37 0.5 kph 129° true\r
-Trackpoint N51 18.77 E12 24.80 01/05/2005 15:05:02 145 m 2 m 0:00:46 0.2 kph 270° true\r
-Trackpoint N51 18.77 E12 24.80 01/05/2005 15:05:45 134 m 2 m 0:00:43 0.2 kph 90° true\r
-Trackpoint N51 18.77 E12 24.80 01/05/2005 15:06:44 131 m 6 m 0:00:59 0.4 kph 162° true\r
-Trackpoint N51 18.77 E12 24.80 01/05/2005 15:07:50 130 m 0 m 0:01:06 0 kph 0° true\r
-Trackpoint N51 18.76 E12 24.80 01/05/2005 15:08:19 132 m 3 m 0:00:29 0.4 kph 180° true\r
-Trackpoint N51 18.77 E12 24.80 01/05/2005 15:11:16 144 m 6 m 0:02:57 0.1 kph 342° true\r
-Trackpoint N51 18.77 E12 24.81 01/05/2005 15:12:34 147 m 16 m 0:01:18 0.7 kph 38° true\r
-Trackpoint N51 18.78 E12 24.83 01/05/2005 15:13:18 145 m 27 m 0:00:44 2 kph 70° true\r
-Trackpoint N51 18.78 E12 24.83 01/05/2005 15:13:27 145 m 6 m 0:00:09 2 kph 0° true\r
-Trackpoint N51 18.78 E12 24.83 01/05/2005 15:13:37 135 m 2 m 0:00:10 0.7 kph 90° true\r
-Trackpoint N51 18.79 E12 24.83 01/05/2005 15:13:46 135 m 6 m 0:00:09 2 kph 0° true\r
-Trackpoint N51 18.79 E12 24.83 01/05/2005 15:14:03 136 m 13 m 0:00:17 3 kph 17° true\r
-Trackpoint N51 18.80 E12 24.84 01/05/2005 15:14:16 135 m 11 m 0:00:13 3 kph 32° true\r
-Trackpoint N51 18.80 E12 24.84 01/05/2005 15:14:26 139 m 7 m 0:00:10 2 kph 117° true\r
-Trackpoint N51 18.80 E12 24.85 01/05/2005 15:14:30 139 m 4 m 0:00:04 4 kph 90° true\r
-Trackpoint N51 18.78 E12 24.88 01/05/2005 15:15:06 141 m 43 m 0:00:36 4 kph 126° true\r
-Trackpoint N51 18.78 E12 24.89 01/05/2005 15:15:27 140 m 18 m 0:00:21 3 kph 121° true\r
-Trackpoint N51 18.77 E12 24.90 01/05/2005 15:15:39 140 m 10 m 0:00:12 3 kph 128° true\r
-Trackpoint N51 18.78 E12 24.90 01/05/2005 15:25:31 152 m 4 m 0:09:52 0.0 kph 33° true\r
-Trackpoint N51 18.78 E12 24.90 01/05/2005 15:25:40 152 m 0 m 0:00:09 0 kph 0° true\r
-Trackpoint N51 18.78 E12 24.90 01/05/2005 15:29:18 155 m 4 m 0:03:38 0.1 kph 328° true\r
-Trackpoint N51 18.79 E12 24.87 01/05/2005 15:30:30 149 m 33 m 0:01:12 2 kph 311° true\r
-Trackpoint N51 18.79 E12 24.87 01/05/2005 15:30:37 150 m 2 m 0:00:07 1.0 kph 270° true\r
-Trackpoint N51 18.79 E12 24.87 01/05/2005 15:30:47 151 m 8 m 0:00:10 3 kph 270° true\r
-Trackpoint N51 18.79 E12 24.86 01/05/2005 15:30:48 151 m 4 m 0:00:01 14 kph 270° true\r
-Trackpoint N51 18.80 E12 24.83 01/05/2005 15:30:52 150 m 38 m 0:00:04 34 kph 300° true\r
-Trackpoint N51 18.82 E12 24.80 01/05/2005 15:30:57 150 m 57 m 0:00:05 41 kph 315° true\r
-Trackpoint N51 18.84 E12 24.77 01/05/2005 15:31:03 150 m 47 m 0:00:06 28 kph 316° true\r
-Trackpoint N51 18.85 E12 24.75 01/05/2005 15:31:10 150 m 35 m 0:00:07 18 kph 314° true\r
-Trackpoint N51 18.88 E12 24.57 01/05/2005 15:32:38 143 m 210 m 0:01:28 9 kph 283° true\r
-Trackpoint N51 18.88 E12 24.57 01/05/2005 15:32:45 141 m 4 m 0:00:07 2 kph 270° true\r
-Trackpoint N51 18.88 E12 24.57 01/05/2005 15:33:17 143 m 0 m 0:00:32 0 kph 0° true\r
-Trackpoint N51 18.88 E12 24.57 01/05/2005 15:33:42 139 m 4 m 0:00:25 0.6 kph 270° true\r
-Trackpoint N51 18.88 E12 24.56 01/05/2005 15:33:54 139 m 6 m 0:00:12 2 kph 270° true\r
-Trackpoint N51 18.88 E12 24.56 01/05/2005 15:34:04 138 m 0 m 0:00:10 0 kph 0° true\r
-Trackpoint N51 18.88 E12 24.56 01/05/2005 15:34:20 139 m 0 m 0:00:16 0 kph 0° true\r
-Trackpoint N51 18.88 E12 24.56 01/05/2005 15:35:45 144 m 0 m 0:01:25 0 kph 0° true\r
-Trackpoint N51 18.88 E12 24.56 01/05/2005 15:35:56 145 m 0 m 0:00:11 0 kph 0° true\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="45.458204984" minlon="-75.770526640" maxlat="45.497519984" maxlon="-75.684934974"/>
- <wpt lat="45.460366651" lon="-75.767939974">
- <ele>33.700</ele>
- <time>2005-05-09T19:02:01.517Z</time>
- <name>WP0001</name>
- <cmt>WP0001</cmt>
- <desc>WP0001</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>30.600000</pdop>
- </wpt>
- <wpt lat="45.460339984" lon="-75.767591640">
- <ele>33.700</ele>
- <time>2005-05-09T19:02:03.517Z</time>
- <name>WP0002</name>
- <cmt>WP0002</cmt>
- <desc>WP0002</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>30.600000</pdop>
- </wpt>
- <wpt lat="45.458376651" lon="-75.768483307">
- <ele>105.400</ele>
- <time>2005-05-09T20:09:13.594Z</time>
- <name>WP0003</name>
- <cmt>WP0003</cmt>
- <desc>WP0003</desc>
- <fix>dgps</fix>
- <sat>7</sat>
- <pdop>1.400000</pdop>
- </wpt>
- <wpt lat="45.458293318" lon="-75.768566640">
- <ele>104.600</ele>
- <time>2005-05-09T20:09:23.593Z</time>
- <name>WP0004</name>
- <cmt>WP0004</cmt>
- <desc>WP0004</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>2.400000</pdop>
- </wpt>
- <wpt lat="45.458298318" lon="-75.768701640">
- <ele>102.500</ele>
- <time>2005-05-09T20:09:44.592Z</time>
- <name>WP0005</name>
- <cmt>WP0005</cmt>
- <desc>WP0005</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>2.400000</pdop>
- </wpt>
- <wpt lat="45.458266651" lon="-75.769021640">
- <ele>108.900</ele>
- <time>2005-05-09T20:10:04.590Z</time>
- <name>WP0006</name>
- <cmt>WP0006</cmt>
- <desc>WP0006</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>2.200000</pdop>
- </wpt>
- <wpt lat="45.458204984" lon="-75.770038307">
- <ele>108.400</ele>
- <time>2005-05-09T20:11:22.585Z</time>
- <name>WP0007</name>
- <cmt>WP0007</cmt>
- <desc>WP0007</desc>
- <fix>dgps</fix>
- <sat>9</sat>
- <pdop>1.000000</pdop>
- </wpt>
- <wpt lat="45.458274984" lon="-75.770526640">
- <ele>110.600</ele>
- <time>2005-05-09T20:11:50.583Z</time>
- <name>WP0008</name>
- <cmt>WP0008</cmt>
- <desc>WP0008</desc>
- <fix>dgps</fix>
- <sat>8</sat>
- <pdop>1.400000</pdop>
- </wpt>
- <wpt lat="45.458353318" lon="-75.770481640">
- <ele>106.200</ele>
- <time>2005-05-09T20:14:00.575Z</time>
- <name>WP0009</name>
- <cmt>WP0009</cmt>
- <desc>WP0009</desc>
- <fix>dgps</fix>
- <sat>10</sat>
- <pdop>1.000000</pdop>
- </wpt>
- <wpt lat="45.492471651" lon="-75.717699974">
- <ele>34.100</ele>
- <time>2005-05-09T21:36:00.758Z</time>
- <name>WP0010</name>
- <cmt>WP0010</cmt>
- <desc>WP0010</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>7.000000</pdop>
- </wpt>
- <wpt lat="45.492506651" lon="-75.717636640">
- <ele>-22.300</ele>
- <time>2005-06-03T21:36:06.757Z</time>
- <name>WP0011</name>
- <cmt>WP0011</cmt>
- <desc>WP0011</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>2.600000</pdop>
- </wpt>
- <wpt lat="45.492283318" lon="-75.717694974">
- <ele>-34.800</ele>
- <time>2005-06-03T21:36:08.757Z</time>
- <name>WP0012</name>
- <cmt>WP0012</cmt>
- <desc>WP0012</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>3.400000</pdop>
- </wpt>
- <wpt lat="45.492396651" lon="-75.717684974">
- <ele>-28.700</ele>
- <time>2005-06-03T21:36:09.757Z</time>
- <name>WP0013</name>
- <cmt>WP0013</cmt>
- <desc>WP0013</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>2.600000</pdop>
- </wpt>
- <wpt lat="45.492381651" lon="-75.717586640">
- <ele>-21.000</ele>
- <time>2005-06-03T21:36:17.757Z</time>
- <name>WP0014</name>
- <cmt>WP0014</cmt>
- <desc>WP0014</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>3.800000</pdop>
- </wpt>
- <wpt lat="45.492294984" lon="-75.717593307">
- <ele>-25.300</ele>
- <time>2005-06-03T21:36:31.756Z</time>
- <name>WP0015</name>
- <cmt>WP0015</cmt>
- <desc>WP0015</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.491944984" lon="-75.717474974">
- <ele>43.400</ele>
- <time>2005-06-03T21:36:45.755Z</time>
- <name>WP0016</name>
- <cmt>WP0016</cmt>
- <desc>WP0016</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>3.800000</pdop>
- </wpt>
- <wpt lat="45.491938318" lon="-75.717353307">
- <ele>39.300</ele>
- <time>2005-06-03T21:36:51.754Z</time>
- <name>WP0017</name>
- <cmt>WP0017</cmt>
- <desc>WP0017</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.491969984" lon="-75.717238307">
- <ele>48.300</ele>
- <time>2005-06-03T21:36:58.754Z</time>
- <name>WP0018</name>
- <cmt>WP0018</cmt>
- <desc>WP0018</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.491994984" lon="-75.717094974">
- <ele>44.500</ele>
- <time>2005-06-03T21:37:07.753Z</time>
- <name>WP0019</name>
- <cmt>WP0019</cmt>
- <desc>WP0019</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.491996651" lon="-75.716914974">
- <ele>39.900</ele>
- <time>2005-06-03T21:37:18.753Z</time>
- <name>WP0020</name>
- <cmt>WP0020</cmt>
- <desc>WP0020</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>2.600000</pdop>
- </wpt>
- <wpt lat="45.492019984" lon="-75.716781640">
- <ele>23.600</ele>
- <time>2005-06-03T21:37:26.752Z</time>
- <name>WP0021</name>
- <cmt>WP0021</cmt>
- <desc>WP0021</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>2.600000</pdop>
- </wpt>
- <wpt lat="45.492071651" lon="-75.716738307">
- <ele>46.700</ele>
- <time>2005-06-03T21:37:46.751Z</time>
- <name>WP0022</name>
- <cmt>WP0022</cmt>
- <desc>WP0022</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>4.000000</pdop>
- </wpt>
- <wpt lat="45.492071651" lon="-75.716736640">
- <ele>61.300</ele>
- <time>2005-06-03T21:37:52.750Z</time>
- <name>WP0023</name>
- <cmt>WP0023</cmt>
- <desc>WP0023</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.492096651" lon="-75.716736640">
- <ele>74.600</ele>
- <time>2005-06-03T21:38:16.749Z</time>
- <name>WP0024</name>
- <cmt>WP0024</cmt>
- <desc>WP0024</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>4.000000</pdop>
- </wpt>
- <wpt lat="45.492099984" lon="-75.716729974">
- <ele>63.600</ele>
- <time>2005-06-03T21:38:50.747Z</time>
- <name>WP0025</name>
- <cmt>WP0025</cmt>
- <desc>WP0025</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.200000</pdop>
- </wpt>
- <wpt lat="45.492721651" lon="-75.718441640">
- <ele>83.600</ele>
- <time>2005-06-03T21:55:06.472Z</time>
- <name>WP0026</name>
- <cmt>WP0026</cmt>
- <desc>WP0026</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>5.200000</pdop>
- </wpt>
- <wpt lat="45.492656651" lon="-75.718409974">
- <ele>76.200</ele>
- <time>2005-06-03T21:55:14.472Z</time>
- <name>WP0027</name>
- <cmt>WP0027</cmt>
- <desc>WP0027</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>5.200000</pdop>
- </wpt>
- <wpt lat="45.492591651" lon="-75.718313307">
- <ele>76.300</ele>
- <time>2005-06-03T21:57:31.463Z</time>
- <name>WP0028</name>
- <cmt>WP0028</cmt>
- <desc>WP0028</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>10.600000</pdop>
- </wpt>
- <wpt lat="45.492568318" lon="-75.718309974">
- <ele>59.800</ele>
- <time>2005-06-03T21:57:54.461Z</time>
- <name>WP0029</name>
- <cmt>WP0029</cmt>
- <desc>WP0029</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>5.200000</pdop>
- </wpt>
- <wpt lat="45.492314984" lon="-75.718339974">
- <ele>34.300</ele>
- <time>2005-06-04T23:06:26.359Z</time>
- <name>WP0030</name>
- <cmt>WP0030</cmt>
- <desc>WP0030</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>25.400000</pdop>
- </wpt>
- <wpt lat="45.491909984" lon="-75.718324974">
- <ele>34.300</ele>
- <time>2005-06-04T23:14:32.327Z</time>
- <name>WP0031</name>
- <cmt>WP0031</cmt>
- <desc>WP0031</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>28.200001</pdop>
- </wpt>
- <wpt lat="45.492206651" lon="-75.718414974">
- <ele>34.300</ele>
- <time>2005-06-04T23:14:43.327Z</time>
- <name>WP0032</name>
- <cmt>WP0032</cmt>
- <desc>WP0032</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>28.200001</pdop>
- </wpt>
- <wpt lat="45.492689984" lon="-75.718359974">
- <ele>70.800</ele>
- <time>2005-06-04T23:15:39.323Z</time>
- <name>WP0033</name>
- <cmt>WP0033</cmt>
- <desc>WP0033</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.800000</pdop>
- </wpt>
- <wpt lat="45.492691651" lon="-75.718408307">
- <ele>61.200</ele>
- <time>2005-06-04T23:16:38.319Z</time>
- <name>WP0034</name>
- <cmt>WP0034</cmt>
- <desc>WP0034</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.492601651" lon="-75.718438307">
- <ele>62.400</ele>
- <time>2005-06-04T23:17:21.316Z</time>
- <name>WP0035</name>
- <cmt>WP0035</cmt>
- <desc>WP0035</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.492479984" lon="-75.718403307">
- <ele>54.200</ele>
- <time>2005-06-04T23:22:58.294Z</time>
- <name>WP0036</name>
- <cmt>WP0036</cmt>
- <desc>WP0036</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>6.800000</pdop>
- </wpt>
- <wpt lat="45.492566651" lon="-75.718339974">
- <ele>57.000</ele>
- <time>2005-06-04T23:25:52.283Z</time>
- <name>WP0037</name>
- <cmt>WP0037</cmt>
- <desc>WP0037</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>19.400000</pdop>
- </wpt>
- <wpt lat="45.492343318" lon="-75.722331640">
- <ele>0.000</ele>
- <time>2005-06-04T23:39:14.663Z</time>
- <name>WP0038</name>
- <cmt>WP0038</cmt>
- <desc>WP0038</desc>
- <pdop>24.700001</pdop>
- </wpt>
- <wpt lat="45.492314984" lon="-75.722923307">
- <ele>57.600</ele>
- <time>2005-06-04T23:39:18.662Z</time>
- <name>WP0039</name>
- <cmt>WP0039</cmt>
- <desc>WP0039</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>17.799999</pdop>
- </wpt>
- <wpt lat="45.492369984" lon="-75.722586640">
- <ele>74.800</ele>
- <time>2005-06-04T23:39:19.662Z</time>
- <name>WP0040</name>
- <cmt>WP0040</cmt>
- <desc>WP0040</desc>
- <fix>dgps</fix>
- <sat>7</sat>
- <pdop>1.000000</pdop>
- </wpt>
- <wpt lat="45.493596651" lon="-75.728018307">
- <ele>95.100</ele>
- <time>2005-06-04T23:44:29.868Z</time>
- <name>WP0041</name>
- <cmt>WP0041</cmt>
- <desc>WP0041</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.492388318" lon="-75.731491640">
- <ele>69.100</ele>
- <time>2005-06-04T23:50:38.425Z</time>
- <name>WP0042</name>
- <cmt>WP0042</cmt>
- <desc>WP0042</desc>
- <fix>dgps</fix>
- <sat>7</sat>
- <pdop>1.000000</pdop>
- </wpt>
- <wpt lat="45.492379984" lon="-75.731639974">
- <ele>71.300</ele>
- <time>2005-06-04T23:52:35.417Z</time>
- <name>WP0043</name>
- <cmt>WP0043</cmt>
- <desc>WP0043</desc>
- <fix>dgps</fix>
- <sat>7</sat>
- <pdop>1.000000</pdop>
- </wpt>
- <wpt lat="45.492419984" lon="-75.731754974">
- <ele>71.300</ele>
- <time>2005-06-04T23:52:43.417Z</time>
- <name>WP0044</name>
- <cmt>WP0044</cmt>
- <desc>WP0044</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>1.400000</pdop>
- </wpt>
- <wpt lat="45.492678318" lon="-75.732136640">
- <ele>71.300</ele>
- <time>2005-06-04T23:53:15.415Z</time>
- <name>WP0045</name>
- <cmt>WP0045</cmt>
- <desc>WP0045</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>1.400000</pdop>
- </wpt>
- <wpt lat="45.492764984" lon="-75.732181640">
- <ele>70.700</ele>
- <time>2005-06-04T23:53:25.414Z</time>
- <name>WP0046</name>
- <cmt>WP0046</cmt>
- <desc>WP0046</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>1.400000</pdop>
- </wpt>
- <wpt lat="45.493056651" lon="-75.734448307">
- <ele>68.400</ele>
- <time>2005-06-04T23:56:24.496Z</time>
- <name>WP0047</name>
- <cmt>WP0047</cmt>
- <desc>WP0047</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>1.200000</pdop>
- </wpt>
- <wpt lat="45.492984984" lon="-75.734376640">
- <ele>72.900</ele>
- <time>2005-06-04T23:56:54.494Z</time>
- <name>WP0048</name>
- <cmt>WP0048</cmt>
- <desc>WP0048</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>1.200000</pdop>
- </wpt>
- <wpt lat="45.493048318" lon="-75.734484974">
- <ele>71.400</ele>
- <time>2005-06-04T23:57:12.493Z</time>
- <name>WP0049</name>
- <cmt>WP0049</cmt>
- <desc>WP0049</desc>
- <fix>dgps</fix>
- <sat>7</sat>
- <pdop>1.000000</pdop>
- </wpt>
- <wpt lat="45.493248318" lon="-75.734873307">
- <ele>71.200</ele>
- <time>2005-06-04T23:57:43.491Z</time>
- <name>WP0050</name>
- <cmt>WP0050</cmt>
- <desc>WP0050</desc>
- <fix>dgps</fix>
- <sat>8</sat>
- <pdop>1.000000</pdop>
- </wpt>
- <wpt lat="45.493511651" lon="-75.735343307">
- <ele>71.600</ele>
- <time>2005-06-04T23:58:26.488Z</time>
- <name>WP0051</name>
- <cmt>WP0051</cmt>
- <desc>WP0051</desc>
- <fix>dgps</fix>
- <sat>7</sat>
- <pdop>1.400000</pdop>
- </wpt>
- <wpt lat="45.494089984" lon="-75.736121640">
- <ele>71.000</ele>
- <time>2005-06-04T00:00:00.482Z</time>
- <name>WP0052</name>
- <cmt>WP0052</cmt>
- <desc>WP0052</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.494091651" lon="-75.736254974">
- <ele>72.100</ele>
- <time>2005-06-05T00:00:11.482Z</time>
- <name>WP0053</name>
- <cmt>WP0053</cmt>
- <desc>WP0053</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.494156651" lon="-75.736351640">
- <ele>72.700</ele>
- <time>2005-06-05T00:00:20.481Z</time>
- <name>WP0054</name>
- <cmt>WP0054</cmt>
- <desc>WP0054</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.200000</pdop>
- </wpt>
- <wpt lat="45.494316651" lon="-75.736706640">
- <ele>72.200</ele>
- <time>2005-06-05T00:00:48.479Z</time>
- <name>WP0055</name>
- <cmt>WP0055</cmt>
- <desc>WP0055</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.494326651" lon="-75.736839974">
- <ele>72.500</ele>
- <time>2005-06-05T00:00:59.478Z</time>
- <name>WP0056</name>
- <cmt>WP0056</cmt>
- <desc>WP0056</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.494348318" lon="-75.737104974">
- <ele>73.000</ele>
- <time>2005-06-05T00:01:09.478Z</time>
- <name>WP0057</name>
- <cmt>WP0057</cmt>
- <desc>WP0057</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.494411651" lon="-75.737268307">
- <ele>73.300</ele>
- <time>2005-06-05T00:01:44.475Z</time>
- <name>WP0058</name>
- <cmt>WP0058</cmt>
- <desc>WP0058</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>19.400000</pdop>
- </wpt>
- <wpt lat="45.494488318" lon="-75.737228307">
- <ele>78.100</ele>
- <time>2005-06-05T00:01:58.474Z</time>
- <name>WP0059</name>
- <cmt>WP0059</cmt>
- <desc>WP0059</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.000000</pdop>
- </wpt>
- <wpt lat="45.494713318" lon="-75.737163307">
- <ele>77.000</ele>
- <time>2005-06-05T00:02:16.473Z</time>
- <name>WP0060</name>
- <cmt>WP0060</cmt>
- <desc>WP0060</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>4.200000</pdop>
- </wpt>
- <wpt lat="45.494818318" lon="-75.737188307">
- <ele>75.500</ele>
- <time>2005-06-05T00:02:25.473Z</time>
- <name>WP0061</name>
- <cmt>WP0061</cmt>
- <desc>WP0061</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>4.200000</pdop>
- </wpt>
- <wpt lat="45.495011651" lon="-75.737183307">
- <ele>71.000</ele>
- <time>2005-06-05T00:02:42.472Z</time>
- <name>WP0062</name>
- <cmt>WP0062</cmt>
- <desc>WP0062</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>12.400000</pdop>
- </wpt>
- <wpt lat="45.495254984" lon="-75.737171640">
- <ele>75.800</ele>
- <time>2005-06-05T00:03:21.469Z</time>
- <name>WP0063</name>
- <cmt>WP0063</cmt>
- <desc>WP0063</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>4.200000</pdop>
- </wpt>
- <wpt lat="45.495354984" lon="-75.737114974">
- <ele>72.600</ele>
- <time>2005-06-05T00:03:31.468Z</time>
- <name>WP0064</name>
- <cmt>WP0064</cmt>
- <desc>WP0064</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.495581651" lon="-75.736874974">
- <ele>70.300</ele>
- <time>2005-06-05T00:03:53.467Z</time>
- <name>WP0065</name>
- <cmt>WP0065</cmt>
- <desc>WP0065</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>2.800000</pdop>
- </wpt>
- <wpt lat="45.495921651" lon="-75.736509974">
- <ele>74.600</ele>
- <time>2005-06-05T00:04:31.464Z</time>
- <name>WP0066</name>
- <cmt>WP0066</cmt>
- <desc>WP0066</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.800000</pdop>
- </wpt>
- <wpt lat="45.495844984" lon="-75.736588307">
- <ele>76.300</ele>
- <time>2005-06-05T00:05:05.462Z</time>
- <name>WP0067</name>
- <cmt>WP0067</cmt>
- <desc>WP0067</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.495876651" lon="-75.736471640">
- <ele>72.100</ele>
- <time>2005-06-05T00:05:45.459Z</time>
- <name>WP0068</name>
- <cmt>WP0068</cmt>
- <desc>WP0068</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>5.200000</pdop>
- </wpt>
- <wpt lat="45.495916651" lon="-75.736536640">
- <ele>80.900</ele>
- <time>2005-06-05T00:06:19.457Z</time>
- <name>WP0069</name>
- <cmt>WP0069</cmt>
- <desc>WP0069</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>4.000000</pdop>
- </wpt>
- <wpt lat="45.495866651" lon="-75.736521640">
- <ele>89.500</ele>
- <time>2005-06-05T00:06:25.457Z</time>
- <name>WP0070</name>
- <cmt>WP0070</cmt>
- <desc>WP0070</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>4.000000</pdop>
- </wpt>
- <wpt lat="45.496203318" lon="-75.734848307">
- <ele>102.100</ele>
- <time>2005-06-05T00:37:53.913Z</time>
- <name>WP0071</name>
- <cmt>WP0071</cmt>
- <desc>WP0071</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.200000</pdop>
- </wpt>
- <wpt lat="45.496083318" lon="-75.734841640">
- <ele>102.800</ele>
- <time>2005-06-11T00:38:21.912Z</time>
- <name>WP0072</name>
- <cmt>WP0072</cmt>
- <desc>WP0072</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>13.400000</pdop>
- </wpt>
- <wpt lat="45.496109984" lon="-75.734754974">
- <ele>94.100</ele>
- <time>2005-06-11T00:38:55.909Z</time>
- <name>WP0073</name>
- <cmt>WP0073</cmt>
- <desc>WP0073</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.496299984" lon="-75.734379974">
- <ele>93.300</ele>
- <time>2005-06-11T00:39:44.906Z</time>
- <name>WP0074</name>
- <cmt>WP0074</cmt>
- <desc>WP0074</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.496259984" lon="-75.734368307">
- <ele>83.800</ele>
- <time>2005-06-11T00:40:44.902Z</time>
- <name>WP0075</name>
- <cmt>WP0075</cmt>
- <desc>WP0075</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496204984" lon="-75.734474974">
- <ele>85.100</ele>
- <time>2005-06-11T00:41:04.901Z</time>
- <name>WP0076</name>
- <cmt>WP0076</cmt>
- <desc>WP0076</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496191651" lon="-75.734614974">
- <ele>85.600</ele>
- <time>2005-06-11T00:41:11.900Z</time>
- <name>WP0077</name>
- <cmt>WP0077</cmt>
- <desc>WP0077</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>16.000000</pdop>
- </wpt>
- <wpt lat="45.496134984" lon="-75.734768307">
- <ele>85.900</ele>
- <time>2005-06-11T00:41:19.900Z</time>
- <name>WP0078</name>
- <cmt>WP0078</cmt>
- <desc>WP0078</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496108318" lon="-75.734911640">
- <ele>85.200</ele>
- <time>2005-06-11T00:41:27.899Z</time>
- <name>WP0079</name>
- <cmt>WP0079</cmt>
- <desc>WP0079</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.400000</pdop>
- </wpt>
- <wpt lat="45.496044984" lon="-75.735079974">
- <ele>87.100</ele>
- <time>2005-06-11T00:41:43.898Z</time>
- <name>WP0080</name>
- <cmt>WP0080</cmt>
- <desc>WP0080</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>3.200000</pdop>
- </wpt>
- <wpt lat="45.495993318" lon="-75.735166640">
- <ele>82.300</ele>
- <time>2005-06-11T00:41:51.898Z</time>
- <name>WP0081</name>
- <cmt>WP0081</cmt>
- <desc>WP0081</desc>
- <fix>dgps</fix>
- <sat>6</sat>
- <pdop>1.200000</pdop>
- </wpt>
- <wpt lat="45.495931651" lon="-75.735276640">
- <ele>78.800</ele>
- <time>2005-06-11T00:42:00.897Z</time>
- <name>WP0082</name>
- <cmt>WP0082</cmt>
- <desc>WP0082</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.400000</pdop>
- </wpt>
- <wpt lat="45.495874984" lon="-75.735439974">
- <ele>75.500</ele>
- <time>2005-06-11T00:42:14.896Z</time>
- <name>WP0083</name>
- <cmt>WP0083</cmt>
- <desc>WP0083</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.400000</pdop>
- </wpt>
- <wpt lat="45.495826651" lon="-75.735561640">
- <ele>74.100</ele>
- <time>2005-06-11T00:42:25.895Z</time>
- <name>WP0084</name>
- <cmt>WP0084</cmt>
- <desc>WP0084</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.495858318" lon="-75.735689974">
- <ele>72.500</ele>
- <time>2005-06-11T00:42:50.894Z</time>
- <name>WP0085</name>
- <cmt>WP0085</cmt>
- <desc>WP0085</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.495931651" lon="-75.735779974">
- <ele>74.000</ele>
- <time>2005-06-11T00:43:01.893Z</time>
- <name>WP0086</name>
- <cmt>WP0086</cmt>
- <desc>WP0086</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>40.599998</pdop>
- </wpt>
- <wpt lat="45.495899984" lon="-75.735658307">
- <ele>74.700</ele>
- <time>2005-06-11T00:43:09.893Z</time>
- <name>WP0087</name>
- <cmt>WP0087</cmt>
- <desc>WP0087</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.495808318" lon="-75.735613307">
- <ele>72.300</ele>
- <time>2005-06-11T00:43:38.891Z</time>
- <name>WP0088</name>
- <cmt>WP0088</cmt>
- <desc>WP0088</desc>
- </wpt>
- <wpt lat="45.495711651" lon="-75.735599974">
- <ele>72.200</ele>
- <time>2005-06-11T00:44:05.889Z</time>
- <name>WP0089</name>
- <cmt>WP0089</cmt>
- <desc>WP0089</desc>
- </wpt>
- <wpt lat="45.495679984" lon="-75.735724974">
- <ele>73.000</ele>
- <time>2005-06-11T00:44:11.888Z</time>
- <name>WP0090</name>
- <cmt>WP0090</cmt>
- <desc>WP0090</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>38.200001</pdop>
- </wpt>
- <wpt lat="45.495651651" lon="-75.735859974">
- <ele>74.400</ele>
- <time>2005-06-11T00:44:23.888Z</time>
- <name>WP0091</name>
- <cmt>WP0091</cmt>
- <desc>WP0091</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.495756651" lon="-75.735824974">
- <ele>81.200</ele>
- <time>2005-06-11T00:44:43.886Z</time>
- <name>WP0092</name>
- <cmt>WP0092</cmt>
- <desc>WP0092</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>37.200001</pdop>
- </wpt>
- <wpt lat="45.495728318" lon="-75.735801640">
- <ele>70.100</ele>
- <time>2005-06-11T00:44:47.886Z</time>
- <name>WP0093</name>
- <cmt>WP0093</cmt>
- <desc>WP0093</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>9.400000</pdop>
- </wpt>
- <wpt lat="45.495708318" lon="-75.735911640">
- <ele>64.400</ele>
- <time>2005-06-11T00:45:02.885Z</time>
- <name>WP0094</name>
- <cmt>WP0094</cmt>
- <desc>WP0094</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.495683318" lon="-75.736064974">
- <ele>64.000</ele>
- <time>2005-06-11T00:45:35.883Z</time>
- <name>WP0095</name>
- <cmt>WP0095</cmt>
- <desc>WP0095</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.495584984" lon="-75.736138307">
- <ele>64.600</ele>
- <time>2005-06-11T00:46:07.881Z</time>
- <name>WP0096</name>
- <cmt>WP0096</cmt>
- <desc>WP0096</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>23.000000</pdop>
- </wpt>
- <wpt lat="45.495651651" lon="-75.736043307">
- <ele>67.300</ele>
- <time>2005-06-11T00:46:36.879Z</time>
- <name>WP0097</name>
- <cmt>WP0097</cmt>
- <desc>WP0097</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>5.200000</pdop>
- </wpt>
- <wpt lat="45.495691651" lon="-75.735939974">
- <ele>71.400</ele>
- <time>2005-06-11T00:48:44.870Z</time>
- <name>WP0098</name>
- <cmt>WP0098</cmt>
- <desc>WP0098</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>43.599998</pdop>
- </wpt>
- <wpt lat="45.495706651" lon="-75.736066640">
- <ele>71.700</ele>
- <time>2005-06-11T00:49:14.868Z</time>
- <name>WP0099</name>
- <cmt>WP0099</cmt>
- <desc>WP0099</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>24.200001</pdop>
- </wpt>
- <wpt lat="45.495733318" lon="-75.735924974">
- <ele>72.300</ele>
- <time>2005-06-11T00:51:19.860Z</time>
- <name>WP0100</name>
- <cmt>WP0100</cmt>
- <desc>WP0100</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.200000</pdop>
- </wpt>
- <wpt lat="45.495666651" lon="-75.735996640">
- <ele>81.200</ele>
- <time>2005-06-11T00:51:31.859Z</time>
- <name>WP0101</name>
- <cmt>WP0101</cmt>
- <desc>WP0101</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>36.400002</pdop>
- </wpt>
- <wpt lat="45.495646651" lon="-75.735903307">
- <ele>74.500</ele>
- <time>2005-06-11T00:51:43.858Z</time>
- <name>WP0102</name>
- <cmt>WP0102</cmt>
- <desc>WP0102</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.495689984" lon="-75.735704974">
- <ele>74.700</ele>
- <time>2005-06-11T00:51:53.858Z</time>
- <name>WP0103</name>
- <cmt>WP0103</cmt>
- <desc>WP0103</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>13.600000</pdop>
- </wpt>
- <wpt lat="45.495769984" lon="-75.735519974">
- <ele>76.200</ele>
- <time>2005-06-11T00:52:08.857Z</time>
- <name>WP0104</name>
- <cmt>WP0104</cmt>
- <desc>WP0104</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>50.000000</pdop>
- </wpt>
- <wpt lat="45.495858318" lon="-75.735479974">
- <ele>77.900</ele>
- <time>2005-06-11T00:52:19.856Z</time>
- <name>WP0105</name>
- <cmt>WP0105</cmt>
- <desc>WP0105</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>26.400000</pdop>
- </wpt>
- <wpt lat="45.495914984" lon="-75.735378307">
- <ele>78.600</ele>
- <time>2005-06-11T00:52:27.856Z</time>
- <name>WP0106</name>
- <cmt>WP0106</cmt>
- <desc>WP0106</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>50.000000</pdop>
- </wpt>
- <wpt lat="45.495991651" lon="-75.735234974">
- <ele>80.700</ele>
- <time>2005-06-11T00:52:37.855Z</time>
- <name>WP0107</name>
- <cmt>WP0107</cmt>
- <desc>WP0107</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>1.600000</pdop>
- </wpt>
- <wpt lat="45.496076651" lon="-75.735043307">
- <ele>84.400</ele>
- <time>2005-06-11T00:52:54.854Z</time>
- <name>WP0108</name>
- <cmt>WP0108</cmt>
- <desc>WP0108</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496214984" lon="-75.734634974">
- <ele>92.600</ele>
- <time>2005-06-11T00:53:33.851Z</time>
- <name>WP0109</name>
- <cmt>WP0109</cmt>
- <desc>WP0109</desc>
- <fix>dgps</fix>
- <sat>5</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.496243318" lon="-75.734476640">
- <ele>95.800</ele>
- <time>2005-06-11T00:53:43.850Z</time>
- <name>WP0110</name>
- <cmt>WP0110</cmt>
- <desc>WP0110</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>5.000000</pdop>
- </wpt>
- <wpt lat="45.496326651" lon="-75.734336640">
- <ele>94.700</ele>
- <time>2005-06-11T00:53:53.850Z</time>
- <name>WP0111</name>
- <cmt>WP0111</cmt>
- <desc>WP0111</desc>
- <fix>dgps</fix>
- <sat>7</sat>
- <pdop>0.800000</pdop>
- </wpt>
- <wpt lat="45.496198318" lon="-75.734216640">
- <ele>59.200</ele>
- <time>2005-06-11T14:39:26.882Z</time>
- <name>WP0112</name>
- <cmt>WP0112</cmt>
- <desc>WP0112</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>9.400000</pdop>
- </wpt>
- <wpt lat="45.496179984" lon="-75.734338307">
- <ele>55.200</ele>
- <time>2005-06-12T14:39:42.881Z</time>
- <name>WP0113</name>
- <cmt>WP0113</cmt>
- <desc>WP0113</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.000000</pdop>
- </wpt>
- <wpt lat="45.496081651" lon="-75.734656640">
- <ele>56.100</ele>
- <time>2005-06-12T14:40:08.879Z</time>
- <name>WP0114</name>
- <cmt>WP0114</cmt>
- <desc>WP0114</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>7.600000</pdop>
- </wpt>
- <wpt lat="45.495996651" lon="-75.734781640">
- <ele>54.500</ele>
- <time>2005-06-12T14:40:16.878Z</time>
- <name>WP0115</name>
- <cmt>WP0115</cmt>
- <desc>WP0115</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>11.800000</pdop>
- </wpt>
- <wpt lat="45.495906651" lon="-75.734983307">
- <ele>48.700</ele>
- <time>2005-06-12T14:40:33.877Z</time>
- <name>WP0116</name>
- <cmt>WP0116</cmt>
- <desc>WP0116</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.495801651" lon="-75.735363307">
- <ele>43.700</ele>
- <time>2005-06-12T14:41:02.875Z</time>
- <name>WP0117</name>
- <cmt>WP0117</cmt>
- <desc>WP0117</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>7.200000</pdop>
- </wpt>
- <wpt lat="45.495801651" lon="-75.735514974">
- <ele>45.100</ele>
- <time>2005-06-12T14:41:16.874Z</time>
- <name>WP0118</name>
- <cmt>WP0118</cmt>
- <desc>WP0118</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.495833318" lon="-75.735654974">
- <ele>44.600</ele>
- <time>2005-06-12T14:41:24.874Z</time>
- <name>WP0119</name>
- <cmt>WP0119</cmt>
- <desc>WP0119</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>16.600000</pdop>
- </wpt>
- <wpt lat="45.495914984" lon="-75.735726640">
- <ele>44.100</ele>
- <time>2005-06-12T14:41:31.873Z</time>
- <name>WP0120</name>
- <cmt>WP0120</cmt>
- <desc>WP0120</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.495956651" lon="-75.735839974">
- <ele>43.000</ele>
- <time>2005-06-12T14:41:40.873Z</time>
- <name>WP0121</name>
- <cmt>WP0121</cmt>
- <desc>WP0121</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496036651" lon="-75.735908307">
- <ele>42.000</ele>
- <time>2005-06-12T14:41:48.872Z</time>
- <name>WP0122</name>
- <cmt>WP0122</cmt>
- <desc>WP0122</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>7.200000</pdop>
- </wpt>
- <wpt lat="45.496151651" lon="-75.735971640">
- <ele>41.400</ele>
- <time>2005-06-12T14:41:55.872Z</time>
- <name>WP0123</name>
- <cmt>WP0123</cmt>
- <desc>WP0123</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.800000</pdop>
- </wpt>
- <wpt lat="45.496328318" lon="-75.735998307">
- <ele>41.600</ele>
- <time>2005-06-12T14:42:05.871Z</time>
- <name>WP0124</name>
- <cmt>WP0124</cmt>
- <desc>WP0124</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.800000</pdop>
- </wpt>
- <wpt lat="45.496431651" lon="-75.735963307">
- <ele>41.600</ele>
- <time>2005-06-12T14:42:14.871Z</time>
- <name>WP0125</name>
- <cmt>WP0125</cmt>
- <desc>WP0125</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.496608318" lon="-75.735874974">
- <ele>41.600</ele>
- <time>2005-06-12T14:42:31.870Z</time>
- <name>WP0126</name>
- <cmt>WP0126</cmt>
- <desc>WP0126</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>7.000000</pdop>
- </wpt>
- <wpt lat="45.496763318" lon="-75.735828307">
- <ele>41.600</ele>
- <time>2005-06-12T14:42:44.869Z</time>
- <name>WP0127</name>
- <cmt>WP0127</cmt>
- <desc>WP0127</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496854984" lon="-75.735886640">
- <ele>41.600</ele>
- <time>2005-06-12T14:42:50.868Z</time>
- <name>WP0128</name>
- <cmt>WP0128</cmt>
- <desc>WP0128</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496996651" lon="-75.735931640">
- <ele>41.600</ele>
- <time>2005-06-12T14:43:03.867Z</time>
- <name>WP0129</name>
- <cmt>WP0129</cmt>
- <desc>WP0129</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497081651" lon="-75.735889974">
- <ele>41.600</ele>
- <time>2005-06-12T14:43:06.867Z</time>
- <name>WP0130</name>
- <cmt>WP0130</cmt>
- <desc>WP0130</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497164984" lon="-75.735838307">
- <ele>41.600</ele>
- <time>2005-06-12T14:43:15.867Z</time>
- <name>WP0131</name>
- <cmt>WP0131</cmt>
- <desc>WP0131</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.497229984" lon="-75.735719974">
- <ele>41.600</ele>
- <time>2005-06-12T14:43:24.866Z</time>
- <name>WP0132</name>
- <cmt>WP0132</cmt>
- <desc>WP0132</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>7.400000</pdop>
- </wpt>
- <wpt lat="45.497303318" lon="-75.735568307">
- <ele>41.700</ele>
- <time>2005-06-12T14:43:34.865Z</time>
- <name>WP0133</name>
- <cmt>WP0133</cmt>
- <desc>WP0133</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>33.799999</pdop>
- </wpt>
- <wpt lat="45.497301651" lon="-75.735439974">
- <ele>41.700</ele>
- <time>2005-06-12T14:43:41.865Z</time>
- <name>WP0134</name>
- <cmt>WP0134</cmt>
- <desc>WP0134</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.800000</pdop>
- </wpt>
- <wpt lat="45.497318318" lon="-75.735193307">
- <ele>41.800</ele>
- <time>2005-06-12T14:43:54.864Z</time>
- <name>WP0135</name>
- <cmt>WP0135</cmt>
- <desc>WP0135</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497329984" lon="-75.734973307">
- <ele>42.300</ele>
- <time>2005-06-12T14:44:06.863Z</time>
- <name>WP0136</name>
- <cmt>WP0136</cmt>
- <desc>WP0136</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>21.799999</pdop>
- </wpt>
- <wpt lat="45.497464984" lon="-75.733798307">
- <ele>45.200</ele>
- <time>2005-06-12T14:44:53.860Z</time>
- <name>WP0137</name>
- <cmt>WP0137</cmt>
- <desc>WP0137</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>7.000000</pdop>
- </wpt>
- <wpt lat="45.497519984" lon="-75.733038307">
- <ele>46.700</ele>
- <time>2005-06-12T14:45:30.858Z</time>
- <name>WP0138</name>
- <cmt>WP0138</cmt>
- <desc>WP0138</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>8.400000</pdop>
- </wpt>
- <wpt lat="45.497474984" lon="-75.732808307">
- <ele>47.400</ele>
- <time>2005-06-12T14:45:44.857Z</time>
- <name>WP0139</name>
- <cmt>WP0139</cmt>
- <desc>WP0139</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>8.600000</pdop>
- </wpt>
- <wpt lat="45.497466651" lon="-75.732938307">
- <ele>48.300</ele>
- <time>2005-06-12T14:45:55.856Z</time>
- <name>WP0140</name>
- <cmt>WP0140</cmt>
- <desc>WP0140</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497506651" lon="-75.733146640">
- <ele>49.000</ele>
- <time>2005-06-12T14:46:07.855Z</time>
- <name>WP0141</name>
- <cmt>WP0141</cmt>
- <desc>WP0141</desc>
- </wpt>
- <wpt lat="45.497499984" lon="-75.733361640">
- <ele>49.400</ele>
- <time>2005-06-12T14:46:22.854Z</time>
- <name>WP0142</name>
- <cmt>WP0142</cmt>
- <desc>WP0142</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497463318" lon="-75.733511640">
- <ele>49.900</ele>
- <time>2005-06-12T14:46:37.853Z</time>
- <name>WP0143</name>
- <cmt>WP0143</cmt>
- <desc>WP0143</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>8.200000</pdop>
- </wpt>
- <wpt lat="45.497483318" lon="-75.733636640">
- <ele>49.500</ele>
- <time>2005-06-12T14:47:06.852Z</time>
- <name>WP0144</name>
- <cmt>WP0144</cmt>
- <desc>WP0144</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.400000</pdop>
- </wpt>
- <wpt lat="45.497466651" lon="-75.733898307">
- <ele>55.000</ele>
- <time>2005-06-12T14:47:31.850Z</time>
- <name>WP0145</name>
- <cmt>WP0145</cmt>
- <desc>WP0145</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>9.400000</pdop>
- </wpt>
- <wpt lat="45.497471651" lon="-75.734046640">
- <ele>56.600</ele>
- <time>2005-06-12T14:47:40.849Z</time>
- <name>WP0146</name>
- <cmt>WP0146</cmt>
- <desc>WP0146</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>5.400000</pdop>
- </wpt>
- <wpt lat="45.497383318" lon="-75.734076640">
- <ele>56.100</ele>
- <time>2005-06-12T14:48:17.847Z</time>
- <name>WP0147</name>
- <cmt>WP0147</cmt>
- <desc>WP0147</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>10.000000</pdop>
- </wpt>
- <wpt lat="45.497269984" lon="-75.734148307">
- <ele>56.700</ele>
- <time>2005-06-12T14:48:37.846Z</time>
- <name>WP0148</name>
- <cmt>WP0148</cmt>
- <desc>WP0148</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497241651" lon="-75.734263307">
- <ele>70.600</ele>
- <time>2005-06-12T14:49:04.844Z</time>
- <name>WP0149</name>
- <cmt>WP0149</cmt>
- <desc>WP0149</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>5.200000</pdop>
- </wpt>
- <wpt lat="45.497159984" lon="-75.734243307">
- <ele>75.600</ele>
- <time>2005-06-12T14:49:14.843Z</time>
- <name>WP0150</name>
- <cmt>WP0150</cmt>
- <desc>WP0150</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>5.000000</pdop>
- </wpt>
- <wpt lat="45.497066651" lon="-75.734216640">
- <ele>76.100</ele>
- <time>2005-06-12T14:49:29.842Z</time>
- <name>WP0151</name>
- <cmt>WP0151</cmt>
- <desc>WP0151</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>10.600000</pdop>
- </wpt>
- <wpt lat="45.496981651" lon="-75.734176640">
- <ele>77.400</ele>
- <time>2005-06-12T14:49:49.841Z</time>
- <name>WP0152</name>
- <cmt>WP0152</cmt>
- <desc>WP0152</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.400000</pdop>
- </wpt>
- <wpt lat="45.497001651" lon="-75.734269974">
- <ele>84.500</ele>
- <time>2005-06-12T14:50:10.839Z</time>
- <name>WP0153</name>
- <cmt>WP0153</cmt>
- <desc>WP0153</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.497056651" lon="-75.734181640">
- <ele>90.200</ele>
- <time>2005-06-12T14:50:25.839Z</time>
- <name>WP0154</name>
- <cmt>WP0154</cmt>
- <desc>WP0154</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497098318" lon="-75.734301640">
- <ele>93.200</ele>
- <time>2005-06-12T14:50:45.837Z</time>
- <name>WP0155</name>
- <cmt>WP0155</cmt>
- <desc>WP0155</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497131651" lon="-75.734461640">
- <ele>94.400</ele>
- <time>2005-06-12T14:50:55.837Z</time>
- <name>WP0156</name>
- <cmt>WP0156</cmt>
- <desc>WP0156</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.400000</pdop>
- </wpt>
- <wpt lat="45.497083318" lon="-75.734576640">
- <ele>95.400</ele>
- <time>2005-06-12T14:51:04.836Z</time>
- <name>WP0157</name>
- <cmt>WP0157</cmt>
- <desc>WP0157</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.497011651" lon="-75.734718307">
- <ele>96.500</ele>
- <time>2005-06-12T14:51:16.835Z</time>
- <name>WP0158</name>
- <cmt>WP0158</cmt>
- <desc>WP0158</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.200000</pdop>
- </wpt>
- <wpt lat="45.497041651" lon="-75.734841640">
- <ele>96.300</ele>
- <time>2005-06-12T14:51:38.834Z</time>
- <name>WP0159</name>
- <cmt>WP0159</cmt>
- <desc>WP0159</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496978318" lon="-75.734936640">
- <ele>97.000</ele>
- <time>2005-06-12T14:51:47.833Z</time>
- <name>WP0160</name>
- <cmt>WP0160</cmt>
- <desc>WP0160</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.200000</pdop>
- </wpt>
- <wpt lat="45.496954984" lon="-75.735069974">
- <ele>96.900</ele>
- <time>2005-06-12T14:51:57.832Z</time>
- <name>WP0161</name>
- <cmt>WP0161</cmt>
- <desc>WP0161</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496956651" lon="-75.735244974">
- <ele>98.200</ele>
- <time>2005-06-12T14:52:10.832Z</time>
- <name>WP0162</name>
- <cmt>WP0162</cmt>
- <desc>WP0162</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.200000</pdop>
- </wpt>
- <wpt lat="45.496894984" lon="-75.735343307">
- <ele>98.600</ele>
- <time>2005-06-12T14:52:24.831Z</time>
- <name>WP0163</name>
- <cmt>WP0163</cmt>
- <desc>WP0163</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.200000</pdop>
- </wpt>
- <wpt lat="45.496828318" lon="-75.735484974">
- <ele>98.400</ele>
- <time>2005-06-12T14:52:38.830Z</time>
- <name>WP0164</name>
- <cmt>WP0164</cmt>
- <desc>WP0164</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.496764984" lon="-75.735634974">
- <ele>98.200</ele>
- <time>2005-06-12T14:52:51.829Z</time>
- <name>WP0165</name>
- <cmt>WP0165</cmt>
- <desc>WP0165</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.200000</pdop>
- </wpt>
- <wpt lat="45.496698318" lon="-75.735818307">
- <ele>97.000</ele>
- <time>2005-06-12T14:53:04.828Z</time>
- <name>WP0166</name>
- <cmt>WP0166</cmt>
- <desc>WP0166</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.200000</pdop>
- </wpt>
- <wpt lat="45.496658318" lon="-75.735986640">
- <ele>96.600</ele>
- <time>2005-06-12T14:53:12.828Z</time>
- <name>WP0167</name>
- <cmt>WP0167</cmt>
- <desc>WP0167</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>13.400000</pdop>
- </wpt>
- <wpt lat="45.496573318" lon="-75.736061640">
- <ele>96.100</ele>
- <time>2005-06-12T14:53:17.827Z</time>
- <name>WP0168</name>
- <cmt>WP0168</cmt>
- <desc>WP0168</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>3.200000</pdop>
- </wpt>
- <wpt lat="45.496441651" lon="-75.736114974">
- <ele>94.800</ele>
- <time>2005-06-12T14:53:25.827Z</time>
- <name>WP0169</name>
- <cmt>WP0169</cmt>
- <desc>WP0169</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>13.400000</pdop>
- </wpt>
- <wpt lat="45.496343318" lon="-75.736063307">
- <ele>95.200</ele>
- <time>2005-06-12T14:53:30.826Z</time>
- <name>WP0170</name>
- <cmt>WP0170</cmt>
- <desc>WP0170</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>13.600000</pdop>
- </wpt>
- <wpt lat="45.495934984" lon="-75.735669974">
- <ele>93.600</ele>
- <time>2005-06-12T14:53:51.825Z</time>
- <name>WP0171</name>
- <cmt>WP0171</cmt>
- <desc>WP0171</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>8.800000</pdop>
- </wpt>
- <wpt lat="45.495949984" lon="-75.735524974">
- <ele>92.400</ele>
- <time>2005-06-12T14:53:56.825Z</time>
- <name>WP0172</name>
- <cmt>WP0172</cmt>
- <desc>WP0172</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>3.000000</pdop>
- </wpt>
- <wpt lat="45.495986651" lon="-75.735344974">
- <ele>91.200</ele>
- <time>2005-06-12T14:54:07.824Z</time>
- <name>WP0173</name>
- <cmt>WP0173</cmt>
- <desc>WP0173</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>3.000000</pdop>
- </wpt>
- <wpt lat="45.496024984" lon="-75.735221640">
- <ele>92.400</ele>
- <time>2005-06-12T14:54:19.823Z</time>
- <name>WP0174</name>
- <cmt>WP0174</cmt>
- <desc>WP0174</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.200000</pdop>
- </wpt>
- <wpt lat="45.496096651" lon="-75.734986640">
- <ele>94.400</ele>
- <time>2005-06-12T14:54:46.821Z</time>
- <name>WP0175</name>
- <cmt>WP0175</cmt>
- <desc>WP0175</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.800000</pdop>
- </wpt>
- <wpt lat="45.496131651" lon="-75.734836640">
- <ele>92.800</ele>
- <time>2005-06-12T14:55:02.820Z</time>
- <name>WP0176</name>
- <cmt>WP0176</cmt>
- <desc>WP0176</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.800000</pdop>
- </wpt>
- <wpt lat="45.496186651" lon="-75.734716640">
- <ele>94.900</ele>
- <time>2005-06-12T14:55:11.820Z</time>
- <name>WP0177</name>
- <cmt>WP0177</cmt>
- <desc>WP0177</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>9.000000</pdop>
- </wpt>
- <wpt lat="45.496241651" lon="-75.734586640">
- <ele>95.600</ele>
- <time>2005-06-12T14:55:21.819Z</time>
- <name>WP0178</name>
- <cmt>WP0178</cmt>
- <desc>WP0178</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.800000</pdop>
- </wpt>
- <wpt lat="45.496301651" lon="-75.734363307">
- <ele>96.300</ele>
- <time>2005-06-12T14:55:43.818Z</time>
- <name>WP0179</name>
- <cmt>WP0179</cmt>
- <desc>WP0179</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>9.200000</pdop>
- </wpt>
- <wpt lat="45.496216651" lon="-75.734409974">
- <ele>96.300</ele>
- <time>2005-06-12T14:56:17.815Z</time>
- <name>WP0180</name>
- <cmt>WP0180</cmt>
- <desc>WP0180</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.496306651" lon="-75.734371640">
- <ele>98.800</ele>
- <time>2005-06-12T14:56:27.815Z</time>
- <name>WP0181</name>
- <cmt>WP0181</cmt>
- <desc>WP0181</desc>
- <fix>3d</fix>
- <sat>4</sat>
- <pdop>2.600000</pdop>
- </wpt>
- <wpt lat="45.496194984" lon="-75.734224974">
- <ele>97.900</ele>
- <time>2005-06-12T14:57:10.812Z</time>
- <name>WP0182</name>
- <cmt>WP0182</cmt>
- <desc>WP0182</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>9.600000</pdop>
- </wpt>
- <wpt lat="45.495998318" lon="-75.734101640">
- <ele>97.600</ele>
- <time>2005-06-12T14:57:13.812Z</time>
- <name>WP0183</name>
- <cmt>WP0183</cmt>
- <desc>WP0183</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.494281651" lon="-75.733509974">
- <ele>97.300</ele>
- <time>2005-06-12T14:57:44.810Z</time>
- <name>WP0184</name>
- <cmt>WP0184</cmt>
- <desc>WP0184</desc>
- </wpt>
- <wpt lat="45.491526651" lon="-75.730496640">
- <ele>97.500</ele>
- <time>2005-06-12T14:58:20.807Z</time>
- <name>WP0185</name>
- <cmt>WP0185</cmt>
- <desc>WP0185</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.490809984" lon="-75.728584974">
- <ele>97.700</ele>
- <time>2005-06-12T14:58:21.807Z</time>
- <name>WP0186</name>
- <cmt>WP0186</cmt>
- <desc>WP0186</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.489388318" lon="-75.725018307">
- <ele>98.100</ele>
- <time>2005-06-12T14:58:24.807Z</time>
- <name>WP0187</name>
- <cmt>WP0187</cmt>
- <desc>WP0187</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.488314984" lon="-75.722894974">
- <ele>98.200</ele>
- <time>2005-06-12T14:58:28.807Z</time>
- <name>WP0188</name>
- <cmt>WP0188</cmt>
- <desc>WP0188</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.487204984" lon="-75.721489974">
- <ele>98.200</ele>
- <time>2005-06-12T14:58:34.807Z</time>
- <name>WP0189</name>
- <cmt>WP0189</cmt>
- <desc>WP0189</desc>
- </wpt>
- <wpt lat="45.487416651" lon="-75.720791640">
- <ele>97.900</ele>
- <time>2005-06-12T14:58:42.806Z</time>
- <name>WP0190</name>
- <cmt>WP0190</cmt>
- <desc>WP0190</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.488398318" lon="-75.721109974">
- <ele>97.800</ele>
- <time>2005-06-12T14:58:43.806Z</time>
- <name>WP0191</name>
- <cmt>WP0191</cmt>
- <desc>WP0191</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.490408318" lon="-75.722254974">
- <ele>101.300</ele>
- <time>2005-06-12T14:58:46.806Z</time>
- <name>WP0192</name>
- <cmt>WP0192</cmt>
- <desc>WP0192</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.491743318" lon="-75.723359974">
- <ele>105.300</ele>
- <time>2005-06-12T14:58:52.805Z</time>
- <name>WP0193</name>
- <cmt>WP0193</cmt>
- <desc>WP0193</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>10.000000</pdop>
- </wpt>
- <wpt lat="45.491659984" lon="-75.723431640">
- <ele>105.600</ele>
- <time>2005-06-12T14:58:54.805Z</time>
- <name>WP0194</name>
- <cmt>WP0194</cmt>
- <desc>WP0194</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.491213318" lon="-75.723554974">
- <ele>105.700</ele>
- <time>2005-06-12T14:59:01.805Z</time>
- <name>WP0195</name>
- <cmt>WP0195</cmt>
- <desc>WP0195</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.490278318" lon="-75.723608307">
- <ele>104.700</ele>
- <time>2005-06-12T14:59:15.804Z</time>
- <name>WP0196</name>
- <cmt>WP0196</cmt>
- <desc>WP0196</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.490369984" lon="-75.723388307">
- <ele>103.600</ele>
- <time>2005-06-12T14:59:17.804Z</time>
- <name>WP0197</name>
- <cmt>WP0197</cmt>
- <desc>WP0197</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.490526651" lon="-75.721809974">
- <ele>101.300</ele>
- <time>2005-06-12T14:59:24.803Z</time>
- <name>WP0198</name>
- <cmt>WP0198</cmt>
- <desc>WP0198</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.490071651" lon="-75.720394974">
- <ele>99.900</ele>
- <time>2005-06-12T14:59:29.803Z</time>
- <name>WP0199</name>
- <cmt>WP0199</cmt>
- <desc>WP0199</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>2.600000</pdop>
- </wpt>
- <wpt lat="45.488781651" lon="-75.717853307">
- <ele>98.100</ele>
- <time>2005-06-12T14:59:40.802Z</time>
- <name>WP0200</name>
- <cmt>WP0200</cmt>
- <desc>WP0200</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.488024984" lon="-75.715301640">
- <ele>97.900</ele>
- <time>2005-06-12T14:59:54.801Z</time>
- <name>WP0201</name>
- <cmt>WP0201</cmt>
- <desc>WP0201</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.487381651" lon="-75.712531640">
- <ele>97.700</ele>
- <time>2005-06-12T15:00:08.800Z</time>
- <name>WP0202</name>
- <cmt>WP0202</cmt>
- <desc>WP0202</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.487396651" lon="-75.711828307">
- <ele>97.700</ele>
- <time>2005-06-12T15:00:12.800Z</time>
- <name>WP0203</name>
- <cmt>WP0203</cmt>
- <desc>WP0203</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.487534984" lon="-75.711744974">
- <ele>97.700</ele>
- <time>2005-06-12T15:00:13.800Z</time>
- <name>WP0204</name>
- <cmt>WP0204</cmt>
- <desc>WP0204</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.487728318" lon="-75.711471640">
- <ele>97.500</ele>
- <time>2005-06-12T15:00:15.800Z</time>
- <name>WP0205</name>
- <cmt>WP0205</cmt>
- <desc>WP0205</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.487859984" lon="-75.710994974">
- <ele>97.300</ele>
- <time>2005-06-12T15:00:17.800Z</time>
- <name>WP0206</name>
- <cmt>WP0206</cmt>
- <desc>WP0206</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.488128318" lon="-75.708784974">
- <ele>97.100</ele>
- <time>2005-06-12T15:00:26.799Z</time>
- <name>WP0207</name>
- <cmt>WP0207</cmt>
- <desc>WP0207</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.488351651" lon="-75.705628307">
- <ele>97.000</ele>
- <time>2005-06-12T15:00:39.798Z</time>
- <name>WP0208</name>
- <cmt>WP0208</cmt>
- <desc>WP0208</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.488748318" lon="-75.704488307">
- <ele>97.100</ele>
- <time>2005-06-12T15:00:43.798Z</time>
- <name>WP0209</name>
- <cmt>WP0209</cmt>
- <desc>WP0209</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.400000</pdop>
- </wpt>
- <wpt lat="45.489294984" lon="-75.703023307">
- <ele>97.200</ele>
- <time>2005-06-12T15:00:52.798Z</time>
- <name>WP0210</name>
- <cmt>WP0210</cmt>
- <desc>WP0210</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.400000</pdop>
- </wpt>
- <wpt lat="45.489278318" lon="-75.703171640">
- <ele>97.100</ele>
- <time>2005-06-12T15:00:56.797Z</time>
- <name>WP0211</name>
- <cmt>WP0211</cmt>
- <desc>WP0211</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.400000</pdop>
- </wpt>
- <wpt lat="45.489263318" lon="-75.703306640">
- <ele>96.900</ele>
- <time>2005-06-12T15:01:14.796Z</time>
- <name>WP0212</name>
- <cmt>WP0212</cmt>
- <desc>WP0212</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.489364984" lon="-75.702803307">
- <ele>96.900</ele>
- <time>2005-06-12T15:01:37.795Z</time>
- <name>WP0213</name>
- <cmt>WP0213</cmt>
- <desc>WP0213</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.489553318" lon="-75.700098307">
- <ele>97.300</ele>
- <time>2005-06-12T15:01:45.794Z</time>
- <name>WP0214</name>
- <cmt>WP0214</cmt>
- <desc>WP0214</desc>
- </wpt>
- <wpt lat="45.489698318" lon="-75.698621640">
- <ele>97.200</ele>
- <time>2005-06-12T15:01:59.793Z</time>
- <name>WP0215</name>
- <cmt>WP0215</cmt>
- <desc>WP0215</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>6.400000</pdop>
- </wpt>
- <wpt lat="45.489766651" lon="-75.698538307">
- <ele>97.200</ele>
- <time>2005-06-12T15:02:04.793Z</time>
- <name>WP0216</name>
- <cmt>WP0216</cmt>
- <desc>WP0216</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.489761651" lon="-75.698398307">
- <ele>97.100</ele>
- <time>2005-06-12T15:02:12.792Z</time>
- <name>WP0217</name>
- <cmt>WP0217</cmt>
- <desc>WP0217</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.489583318" lon="-75.695093307">
- <ele>97.400</ele>
- <time>2005-06-12T15:02:28.791Z</time>
- <name>WP0218</name>
- <cmt>WP0218</cmt>
- <desc>WP0218</desc>
- </wpt>
- <wpt lat="45.489726651" lon="-75.693488307">
- <ele>97.500</ele>
- <time>2005-06-12T15:02:36.791Z</time>
- <name>WP0219</name>
- <cmt>WP0219</cmt>
- <desc>WP0219</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.489909984" lon="-75.693386640">
- <ele>97.500</ele>
- <time>2005-06-12T15:02:37.791Z</time>
- <name>WP0220</name>
- <cmt>WP0220</cmt>
- <desc>WP0220</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.490408318" lon="-75.692841640">
- <ele>97.500</ele>
- <time>2005-06-12T15:02:41.791Z</time>
- <name>WP0221</name>
- <cmt>WP0221</cmt>
- <desc>WP0221</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.490608318" lon="-75.692348307">
- <ele>97.400</ele>
- <time>2005-06-12T15:02:44.790Z</time>
- <name>WP0222</name>
- <cmt>WP0222</cmt>
- <desc>WP0222</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.491079984" lon="-75.690218307">
- <ele>97.400</ele>
- <time>2005-06-12T15:02:56.790Z</time>
- <name>WP0223</name>
- <cmt>WP0223</cmt>
- <desc>WP0223</desc>
- </wpt>
- <wpt lat="45.491288318" lon="-75.688778307">
- <ele>97.300</ele>
- <time>2005-06-12T15:03:04.789Z</time>
- <name>WP0224</name>
- <cmt>WP0224</cmt>
- <desc>WP0224</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.491183318" lon="-75.688611640">
- <ele>97.300</ele>
- <time>2005-06-12T15:03:05.789Z</time>
- <name>WP0225</name>
- <cmt>WP0225</cmt>
- <desc>WP0225</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.490993318" lon="-75.688663307">
- <ele>99.000</ele>
- <time>2005-06-12T15:03:06.789Z</time>
- <name>WP0226</name>
- <cmt>WP0226</cmt>
- <desc>WP0226</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.489688318" lon="-75.688748307">
- <ele>99.300</ele>
- <time>2005-06-12T15:03:16.788Z</time>
- <name>WP0227</name>
- <cmt>WP0227</cmt>
- <desc>WP0227</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.489516651" lon="-75.688719974">
- <ele>99.200</ele>
- <time>2005-06-12T15:03:20.788Z</time>
- <name>WP0228</name>
- <cmt>WP0228</cmt>
- <desc>WP0228</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.489606651" lon="-75.688778307">
- <ele>99.000</ele>
- <time>2005-06-12T15:03:26.788Z</time>
- <name>WP0229</name>
- <cmt>WP0229</cmt>
- <desc>WP0229</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.489716651" lon="-75.688851640">
- <ele>98.600</ele>
- <time>2005-06-12T15:03:53.786Z</time>
- <name>WP0230</name>
- <cmt>WP0230</cmt>
- <desc>WP0230</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.489636651" lon="-75.688773307">
- <ele>98.300</ele>
- <time>2005-06-12T15:04:12.785Z</time>
- <name>WP0231</name>
- <cmt>WP0231</cmt>
- <desc>WP0231</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.489688318" lon="-75.688884974">
- <ele>98.000</ele>
- <time>2005-06-12T15:04:34.783Z</time>
- <name>WP0232</name>
- <cmt>WP0232</cmt>
- <desc>WP0232</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.489699984" lon="-75.688648307">
- <ele>98.200</ele>
- <time>2005-06-12T15:04:37.783Z</time>
- <name>WP0233</name>
- <cmt>WP0233</cmt>
- <desc>WP0233</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.489858318" lon="-75.688149974">
- <ele>98.400</ele>
- <time>2005-06-12T15:04:43.783Z</time>
- <name>WP0234</name>
- <cmt>WP0234</cmt>
- <desc>WP0234</desc>
- <sat>1</sat>
- </wpt>
- <wpt lat="45.489979984" lon="-75.687781640">
- <ele>98.400</ele>
- <time>2005-06-12T15:04:51.782Z</time>
- <name>WP0235</name>
- <cmt>WP0235</cmt>
- <desc>WP0235</desc>
- <fix>2d</fix>
- <sat>3</sat>
- <pdop>2.000000</pdop>
- </wpt>
- <wpt lat="45.489979984" lon="-75.687646640">
- <ele>98.100</ele>
- <time>2005-06-12T15:05:11.781Z</time>
- <name>WP0236</name>
- <cmt>WP0236</cmt>
- <desc>WP0236</desc>
- <sat>2</sat>
- </wpt>
- <wpt lat="45.490004984" lon="-75.684934974">
- <ele>97.400</ele>
- <time>2005-06-12T15:05:30.780Z</time>
- <name>WP0237</name>
- <cmt>WP0237</cmt>
- <desc>WP0237</desc>
- <sat>2</sat>
- </wpt>
-</gpx>
+++ /dev/null
-WitoldM 4529.388N 07541.190W 0000000m 001217AD3124/AP/WEP On/Ch 11/- a
+++ /dev/null
-<DocumentElement>
- <AP>
- <WEP>On</WEP>
- <MAC>001217AD3124</MAC>
- <SSID>WitoldM</SSID>
- <Type>AP</Type>
- <RSSI>0</RSSI>
- <MaxRSSI>-77</MaxRSSI>
- <MinRSSI>-85</MinRSSI>
- <Channel>11</Channel>
- <FirstSeen>2006-03-11T09:07:46-05:00</FirstSeen>
- <LastSeen>2006-03-11T09:07:52-05:00</LastSeen>
- <HDOP>14.2</HDOP>
- <Lat>45.489801666666672</Lat>
- <Lon>-75.686505</Lon>
- </AP>
-</DocumentElement>
+++ /dev/null
-No,Latitude,Longitude,Name\r
-1,37.416384,-122.024853,"701 FIRST AVE, SUNNYVALE, CA, 94089-1019, US"\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-
-<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-xmlns="urn:yahoo:maps"
-xsi:schemaLocation="urn:yahoo:maps http://local.yahooapis.com/MapsService/V1/GeocodeResponse.xsd">
- <Result precision="address">
-<Latitude>37.416384</Latitude>
-
-<Longitude>-122.024853</Longitude>
-<Address>701 FIRST AVE</Address>
-<City>SUNNYVALE</City>
-<State>CA</State>
-
-<Zip>94089-1019</Zip>
-<Country>US</Country>
- </Result>
-</ResultSet>
+++ /dev/null
-/*
-
- Support for SkymapII / SkymapIIIC & KMD150 ascii files
-
- Copyright (C) 2008 Olaf Klein, o.b.klein@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-
-
-#include "defs.h"
-#include <cmath>
-#include <cstdio>
-#include <cstdlib>
-
-#define MYNAME "skyforce"
-
-
-static
-QVector<arglist_t> skyforce_args = {
-};
-
-static gbfile* fin, *fout;
-static int rte_num, wpt_num;
-static short_handle short_h;
-static const Waypoint* prev_wpt;
-
-
-static Waypoint*
-skyforce_parse_coords(const char* str)
-{
- if (strlen(str) < 38) {
- fatal(MYNAME ": Incomplete line!\n");
- }
-
- auto* wpt = new Waypoint;
-
- wpt->latitude = atof(str + 21);
- if (str[20] == 'S') {
- wpt->latitude = -wpt->latitude;
- }
- wpt->latitude = ddmm2degrees(wpt->latitude);
-
- wpt->longitude = atof(str + 30);
- if (str[29] == 'W') {
- wpt->longitude = -wpt->longitude;
- }
- wpt->longitude = ddmm2degrees(wpt->longitude);
-
- return wpt;
-}
-
-
-static Waypoint*
-skyforce_parse_wpt(const char* str, int* rte_num_out)
-{
- Waypoint* wpt = skyforce_parse_coords(str);
- if (wpt == nullptr) {
- return nullptr;
- }
-
- // The line has fixed columns and starts like:
- // R 001 029 BEARHILL N42...
- // Grab "BEARHILL" and whack trailing space.
- wpt->shortname = QString(str).mid(10,9).trimmed();
-
- if (rte_num_out) {
- *rte_num_out = atoi(str + 2);
- }
-
- return wpt;
-}
-
-
-static Waypoint*
-skyforce_parse_trk(const char* str)
-{
- char buf[15];
-
- Waypoint* wpt = skyforce_parse_coords(str);
- if (wpt == nullptr) {
- return nullptr;
- }
- strncpy(buf, str + 2, sizeof(buf) - 1);
- buf[14] = 0;
-
- QDateTime dt = QDateTime::fromString(buf, "ddMMyy hhmmss");
- dt.setTimeSpec(Qt::UTC);
- dt = dt.addYears(100);
-
- wpt->SetCreationTime(dt);
- int len = strlen(str);
-
- if (len >= 45) {
- WAYPT_SET(wpt, speed, KNOTS_TO_MPS(atof(str + 39)));
- }
- if (len >= 59) {
- wpt->altitude = FEET_TO_METERS(atof(str + 54));
- if (str[53] == '-') {
- wpt->altitude = -wpt->altitude;
- }
- }
-
- return wpt;
-}
-
-
-static void
-skyforce_head_disp_cb(const route_head* head)
-{
- prev_wpt = nullptr;
- if (head->rte_waypt_ct() <= 0) {
- return;
- }
-
- wpt_num = 0;
- rte_num++;
-
- if (rte_num > 999) {
- if (rte_num == 1000) {
- warning(MYNAME ": Can't store more than 999 routes. Some routes skipped!\n");
- }
- return;
- }
-}
-
-
-static void
-skyforce_waypt_disp_cb(const Waypoint* wpt)
-{
- char buf[75]; /* long enough for all data types */
-
-
- memset(buf, ' ', sizeof(buf));
- buf[sizeof(buf) - 1] = '\0';
-
- switch (global_opts.objective) {
- case wptdata:
- buf[0] = 'W';
- break;
- case trkdata:
- buf[0] = 'L';
- break;
- case rtedata:
- buf[0] = 'R';
- break;
- default: ; /* should never happen */
- }
-
- if (global_opts.objective == trkdata) {
- struct tm tm;
-
- const time_t tt = wpt->GetCreationTime().toTime_t();
- tm = *gmtime(&tt);
- strftime(buf + 2, sizeof(buf) - 2, "%d%m%y %H%M%S ", &tm);
- } else {
- if (rte_num > 999) {
- return;
- }
-
- wpt_num++;
- if (wpt_num > 999) {
- if (wpt_num == 1000) {
- warning(MYNAME ": Can't store more than 999 waypoints. Some waypoints skipped!\n");
- }
- return;
- }
- QString name;
- if (global_opts.synthesize_shortnames) {
- name = mkshort_from_wpt(short_h, wpt);
- } else {
- name = mkshort(short_h, wpt->shortname);
- }
-
- if (global_opts.objective == rtedata) {
- snprintf(buf + 2, sizeof(buf) - 2, "%03d ", rte_num);
- }
- snprintf(buf + 6, sizeof(buf) - 6, "%03d %-9s ", wpt_num, CSTR(name));
- }
-
-
- double lat = degrees2ddmm(wpt->latitude);
- buf[20] = (wpt->latitude < 0) ? 'S' : 'N';
- snprintf(&buf[21], sizeof(buf) - 21, "%06.2f ", fabs(lat));
-
- double lon = degrees2ddmm(wpt->longitude);
- buf[29] = (wpt->longitude < 0) ? 'W' : 'E';
- snprintf(&buf[30], sizeof(buf) - 30, "%08.2f ", fabs(lon));
-
- if (global_opts.objective == trkdata) {
- double alt;
-
- if (wpt->altitude == unknown_alt) {
- alt = 0;
- } else {
- alt = METERS_TO_FEET(wpt->altitude);
- }
- double speed = MPS_TO_KNOTS(waypt_speed(prev_wpt, wpt));
-
- snprintf(&buf[39], sizeof(buf) - 39, "%06.2f 000.00 %c%05d",
- speed,
- alt < 0 ? '-' : '+', si_round(fabs(alt)));
- }
-
- rtrim(buf);
- gbfprintf(fout, "%s\n", buf);
-
- prev_wpt = wpt;
-}
-
-/*******************************************************************************
-* %%% global callbacks called by gpsbabel main process %%% *
-*******************************************************************************/
-
-static void
-skyforce_rd_init(const QString& fname)
-{
- fin = gbfopen(fname, "r", MYNAME);
-}
-
-
-static void
-skyforce_rd_deinit()
-{
- gbfclose(fin);
-}
-
-
-static void
-skyforce_read()
-{
- char* str;
-
- wpt_num = 0;
- route_head* rte = nullptr;
- route_head* trk = nullptr;
- rte_num = -1;
-
- while ((str = gbfgetstr(fin))) {
-
- Waypoint* wpt;
- int i;
-
- str = lrtrim(str);
- if (*str == '\0') {
- continue;
- }
-
- switch (*str) {
-
- case 'W':
- wpt = skyforce_parse_wpt(str, nullptr);
- if (wpt == nullptr) {
- continue;
- }
- waypt_add(wpt);
- break;
-
- case 'R':
- wpt = skyforce_parse_wpt(str, &i);
- if (wpt == nullptr) {
- continue;
- }
-
- if (i != rte_num) {
- rte_num = i;
- rte = nullptr;
- }
-
- if (rte == nullptr) {
- rte = new route_head;
- route_add_head(rte);
- rte->rte_num = rte_num;
- }
- route_add_wpt(rte, wpt);
- break;
-
- case 'L':
- wpt = skyforce_parse_trk(str);
- if (wpt == nullptr) {
- continue;
- }
- if (trk == nullptr) {
- trk = new route_head;
- track_add_head(trk);
- }
- track_add_wpt(trk, wpt);
- break;
-
- default:
- fatal(MYNAME ": Invalid line marker '%c'!\n", *str);
- }
- }
-}
-
-
-static void
-skyforce_wr_init(const QString& fname)
-{
- fout = gbfopen(fname, "w", MYNAME);
-
- short_h = mkshort_new_handle();
-
- setshort_length(short_h, 9);
- setshort_badchars(short_h, "\r\n\t");
- setshort_mustupper(short_h, 1);
- setshort_mustuniq(short_h, 1);
- setshort_whitespace_ok(short_h, 0);
- setshort_repeating_whitespace_ok(short_h, 0);
-
- wpt_num = 0;
- rte_num = 0;
-}
-
-
-static void
-skyforce_wr_deinit()
-{
- mkshort_del_handle(&short_h);
- gbfclose(fout);
-}
-
-
-static void
-skyforce_write()
-{
- switch (global_opts.objective) { /* We can only write one data type at a time */
-
- case wptdata:
- setshort_defname(short_h, "WPT");
- waypt_disp_all(skyforce_waypt_disp_cb);
- break;
-
- case rtedata:
- setshort_defname(short_h, "RTE");
- setshort_mustuniq(short_h, 0);
- route_disp_all(skyforce_head_disp_cb, nullptr, skyforce_waypt_disp_cb);
- break;
-
- case trkdata:
- track_disp_all(skyforce_head_disp_cb, nullptr, skyforce_waypt_disp_cb);
- break;
-
- case posndata:
- fatal(MYNAME ": Realtime positioning not supported.\n");
- break;
-
- default:
- fatal(MYNAME ": Unknown data mode!\n");
- }
-}
-
-
-/**************************************************************************/
-
-ff_vecs_t skyforce_vecs = {
- ff_type_file,
- FF_CAP_RW_ALL, /* read and write waypoints, tracks and routes*/
- skyforce_rd_init,
- skyforce_wr_init,
- skyforce_rd_deinit,
- skyforce_wr_deinit,
- skyforce_read,
- skyforce_write,
- nullptr,
- &skyforce_args,
- CET_CHARSET_ASCII, 1
- , NULL_POS_OPS,
- nullptr
-};
-
-/**************************************************************************/
+++ /dev/null
-/*
-
- Support for Suunto Trackmanager SDF format.
-
- Copyright (C) 2005,2007 Olaf Klein, o.b.klein@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-/*
- 2006/04/05: initial release (not published in GPSBabel)
- 2006/07/19: finished reader and writer for type 4,5,28 of ver. 1
- 2006/10/31: remove wptdata from case statement (data_write)
-
- ToDo: Ascending/Descending
-*/
-
-#include "defs.h"
-
-#if CSVFMTS_ENABLED
-
-#include <algorithm> // for sort
-#include <cstdlib> // for atoi
-#include <cstring> // for strchr
-#include <ctime> // for localtime, strftime
-
-#include <QDate> // for QDate
-#include <QDateTime> // for QDateTime
-#include <QList> // for QList<>::iterator, QList
-#include <QRegularExpression> // for QRegularExpression
-#include <QString> // for QString, operator+
-#include <QStringList> // for QStringList
-#include <QTime> // for QTime
-#include <QtGlobal> // for qAsConst, QAddConst<>::Type
-
-#include "cet_util.h" // for cet_convert_init
-#include "csv_util.h" // for csv_lineparse
-#include "gbfile.h" // for gbfprintf, gbfclose, gbfopen, gbfgetstr, gbfile
-#include "grtcirc.h" // for RAD, gcdist, heading_true_degrees, radtometers
-#include "jeeps/gpsmath.h" // for GPS_Lookup_Datum_Index, GPS_Math_WGS84_To_Known_Datum_M
-#include "src/core/datetime.h" // for DateTime
-#include "src/core/logging.h" // for Warning, Fatal
-
-
-#define MYNAME "stmsdf"
-
-#define ALT(a) (a->altitude != unknown_alt) ? a->altitude : 0
-
-enum sdf_section_e {
- sdf_unknown,
- sdf_header,
- sdf_points,
- sdf_custom
-};
-
-static gbfile* fin, *fout;
-
-static int lineno;
-static int datum;
-static int filetype;
-static route_head* route;
-static QList<Waypoint*> trackpts;
-static QString rte_name;
-static QString rte_desc;
-
-static const Waypoint* trkpt_out;
-static const route_head* trk_out;
-
-static double trkpt_dist;
-static double minalt, maxalt, maxspeed;
-static double this_distance, all_dist;
-static time_t this_time, all_time;
-static double all_asc, all_desc;
-static int this_index; /* from 1 to ... */
-static int all_points;
-static int this_points;
-static int saved_points;
-static time_t start_time;
-static bool this_valid;
-static short_handle short_h;
-
-#define route_index this_index
-#define track_index this_index
-#define all_route_points all_points
-#define all_track_points all_points
-#define route_points this_points
-#define track_points this_points
-#define saved_track_points saved_points
-#define this_route_valid this_valid
-
-/* placeholders for options */
-
-static char* opt_route_index;
-static int opt_route_index_value;
-
-static
-QVector<arglist_t> stmsdf_args = {
- {
- "index", &opt_route_index,
- "Index of route (if more than one in source)", "1", ARGTYPE_INT, "1", nullptr, nullptr
- },
-};
-
-
-/* ----------------------------------------------------------- */
-
-static void
-parse_header(char* line)
-{
- char* str;
- QString key;
- const char* prod = nullptr;
- int column = -1;
-
- while ((str = csv_lineparse(line, "=", "", lineno))) {
- line = nullptr;
- column++;
- QString qstr(str);
- bool ok;
-
- switch (column) {
- case 0:
- key = qstr.toUpper();
- break;
- case 1:
- if (key == "DATUM") {
- datum = GPS_Lookup_Datum_Index(str);
- } else if (key == "FILEVERSION") {
- int ver = qstr.toInt(&ok);
- is_fatal(!ok || (ver != 1),
- MYNAME ": This version '%d' is not yet supported. Please report!", ver);
- } else if (key == "NAME") {
- rte_name = str;
- } else if (key == "NOTES") /* ToDo */;
- else if (key == "SOURCE") {
- rte_desc = str;
- } else if (key == "TYPE") {
- filetype = qstr.toInt(&ok);
- if (!ok) {
- fatal(FatalMsg() << MYNAME << "Unknown file type " << key);
- }
- switch (filetype) {
- case 4: /* M9 TrackLog (Suunto Sail Manager) */
- case 5: /* route */
- case 28: /* X9 TrackLog (Suunto Trek Manager */
- break;
-
- // 2014-02-11: Added breaks after 78 and 79 as the author "obviously"
- // meant to treat those as handled.
- case 78:
- prod = "S6 SkiChrono";
- break;
- case 79:
- prod = "S6 Skilog";
- break;
-
- default:
- if (prod == nullptr) {
- prod = "unknown";
- }
- fatal(MYNAME ": Unsupported file type (%s, type %d)!\n", prod, filetype);
- }
- break;
- default:
- break;
- }
- }
- }
-}
-
-static bool
-track_sort_cb(const Waypoint* a, const Waypoint* b)
-{
- return a->GetCreationTime() < b->GetCreationTime();
-}
-
-static void
-finalize_tracks()
-{
- route_head* track = nullptr;
- int trackno = 0;
-
- if (trackpts.isEmpty()) {
- return;
- }
-
- std::sort(trackpts.begin(), trackpts.end(), track_sort_cb);
-
- foreach (Waypoint* wpt, trackpts) {
- if (wpt->wpt_flags.fmt_use == 2) { /* log continued */
- track = nullptr;
- }
- if (track == nullptr) {
- track = new route_head;
- track_add_head(track);
- trackno++;
- if (rte_name != nullptr) {
- if (trackno > 1) {
- track->rte_name = QString("%1 (%2)").arg(rte_name).arg(trackno);
- } else {
- track->rte_name = rte_name;
- }
- }
- if (rte_desc != nullptr) {
- track->rte_desc = rte_desc;
- }
- }
- track_add_wpt(track, wpt);
- if (wpt->wpt_flags.fmt_use == 1) { /* log pause */
- track = nullptr;
- }
- wpt->wpt_flags.fmt_use = 0;
- }
-
- trackpts.clear();
-}
-
-static void
-parse_point(char *line) {
- char *str;
- int column = -1;
- int what = -1; /* -1 = unknown, 0 = tp, 1 = mp, 2 = wp, 3 = ap */
- Waypoint *wpt = nullptr;
- QDate dt;
- QTime tm;
-
- while ((str = csv_lineparse(line, ",", "", lineno))) {
-
- line = nullptr;
- column++;
- QString qstr(str);
- bool ok(true);
- // TODO: Several entries use a QString variant. This whole function should just parse it like that.
-
- switch (column) {
- case 0:
- if (qstr == "\"TP\"") {
- what = 0;
- column++; /* skip name */
- } else if (qstr == "\"MP\"") {
- what = 1;
- } else if (qstr == "\"WP\"") {
- what = 2;
- } else if (qstr == "\"AP\"") {
- what = 3;
- } else {
- warning(MYNAME ": Unknown point type %s at line %d!\n", str, lineno);
- return;
- }
- wpt = new Waypoint;
- break;
-
- case 1:
- wpt->shortname = qstr.remove('\"');
- if ((what == 2) || (what == 3)) {
- column += 2; /* doesn't have date and time */
- }
- break;
- case 2: {
- // Date is in format dd.mm.yyyy
- const auto v = qstr.split('.');
-
- if (v.size() == 3) {
- auto day = v[0].toInt();
- auto month = v[1].toInt();
- auto year = v[2].toInt();
- dt = QDate(year, month, day);
- } else {
- fatal(FatalMsg() << MYNAME << "Invalid date" << qstr);
- }
- break;
- }
- case 3: {
- // Time is hh:mm.ss - yes, colon and period.
- const auto v = qstr.split(QRegularExpression("[.:]"));
- if (v.size() == 3) {
- auto hour = v[0].toInt();
- auto min = v[1].toInt();
- auto sec = v[2].toInt();
- tm = QTime(hour, min, sec);
- } else {
- fatal(FatalMsg() << MYNAME << "Invalid Time" << qstr);
- }
- break;
- }
- case 4:
- wpt->latitude = qstr.toDouble(&ok);
- if (!ok) {
- fatal(FatalMsg() << MYNAME << "Invalid latitude" << qstr);
- }
- break;
- case 5:
- wpt->longitude = qstr.toDouble(&ok);
- if (!ok) {
- fatal(FatalMsg() << MYNAME << "Invalid longitude" << qstr);
- }
- break;
- case 6: {
- // Not entirely sure if this is optional.
- double alt = qstr.toDouble(&ok);
- if (ok) {
- wpt->altitude = alt;
- }
- }
- break;
- case 7: {
- auto v = qstr.toFloat(&ok);
- if (ok) {
- if (what == 0) {
- WAYPT_SET(wpt, speed, v * 3.6);
- } else if (what == 3) {
- WAYPT_SET(wpt, proximity, v);
- wpt->notes = QString("Alarm point: radius=" + qstr);
- }
- }
- break;
- }
- case 8:
- if (what == 0) {
- auto scourse = qstr.toFloat(&ok);
- if (ok) {
- WAYPT_SET(wpt, course, scourse);
- }
- }
- break;
- case 9:
- case 10:
- default:
- break;
- case 11:
- if (wpt && what == 1) {
- wpt->wpt_flags.fmt_use = qstr.toUInt(&ok); /* memory point type */
- }
- break;
- }
- }
-
- if (dt.isValid() && tm.isValid()) {
- wpt->SetCreationTime(QDateTime(dt, tm));
- }
-
- if (datum != DATUM_WGS84) {
- double ht;
- GPS_Math_WGS84_To_Known_Datum_M(wpt->latitude, wpt->longitude, 0,
- &wpt->latitude, &wpt->longitude, &ht, datum);
- }
-
- switch (what) {
- case 0:
- case 1:
- trackpts.append(wpt);
- break;
- case 2:
- case 3:
- if (route == nullptr) {
- route = new route_head;
- route_add_head(route);
- }
- route_add_wpt(route, wpt);
- break;
- default:
- Warning() << MYNAME << "Invalid internal field type" << what;
- }
-}
-
-/* ----------------------------------------------------------- */
-
-static void
-rd_init(const QString& fname)
-{
- fin = gbfopen(fname, "r", MYNAME);
-
- lineno = 0;
- route = nullptr;
- datum = DATUM_WGS84;
- filetype = 28;
- rte_name = rte_desc = QString();
-
- trackpts.clear();
-}
-
-static void
-rd_deinit()
-{
- gbfclose(fin);
- rte_name = QString();
- rte_desc = QString();
-}
-
-static void
-data_read()
-{
- char* buf;
- sdf_section_e section = sdf_unknown;
-
- while ((buf = gbfgetstr(fin))) {
- char* cin = lrtrim(buf);
- if ((lineno++ == 0) && fin->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
-
- if (*cin == '\0') {
- continue;
- }
-
- if (*cin == '[') {
- char* cend = strchr(++cin, ']');
-
- if (cend != nullptr) {
- *cend = '\0';
- cin = lrtrim(cin);
- }
- if ((*cin == '\0') || (cend == nullptr)) {
- fatal(MYNAME ": Invalid section header!\n");
- }
-
- if (case_ignore_strcmp(cin, "HEADER") == 0) {
- section = sdf_header;
- } else if (case_ignore_strcmp(cin, "POINTS") == 0) {
- section = sdf_points;
- } else if (case_ignore_strncmp(cin, "CUSTOM", 6) == 0) {
- section = sdf_custom;
- } else {
- warning(MYNAME ": Unknown section \"%s\". Please report.\n", cin);
- section = sdf_unknown;
- }
- } else switch (section) {
- case sdf_header:
- parse_header(cin);
- break;
- case sdf_points:
- parse_point(cin);
- break;
- case sdf_custom:
- case sdf_unknown:
- break;
- }
- }
- finalize_tracks(); /* memory points can be at the end of all trackpoints */
-}
-
-
-static void
-calculate(const Waypoint* wpt, double* dist, double* speed, double* course,
- double* asc, double* desc)
-{
- if (trkpt_out != nullptr) {
- *course = heading_true_degrees(
- RAD(trkpt_out->latitude), RAD(trkpt_out->longitude),
- RAD(wpt->latitude), RAD(wpt->longitude));
-
- *dist = radtometers(gcdist(
- RAD(trkpt_out->latitude), RAD(trkpt_out->longitude),
- RAD(wpt->latitude), RAD(wpt->longitude)));
- if (*dist < 0.1) {
- *dist = 0; /* calc. diffs on 32- and 64-bit hosts */
- }
-
- time_t time = wpt->creation_time.toTime_t() - trkpt_out->GetCreationTime().toTime_t();
- if (time == 0) {
- *speed = 0;
- } else {
- *speed = *dist / (double)time;
- }
-
- if (asc && desc && (trkpt_out->altitude != unknown_alt) && (wpt->altitude != unknown_alt)) {
- double dh = wpt->altitude - trkpt_out->altitude;
- if (dh > 0) {
- *asc += dh;
- } else {
- *desc -= dh;
- }
- }
- } else {
- *speed = 0;
- *dist = 0;
- *course = 0;
- if (asc) {
- *asc = 0;
- }
- if (desc) {
- *desc = 0;
- }
- }
- if WAYPT_HAS(wpt, speed) {
- *speed = wpt->speed / 3.6; /* -> meters per second */
- }
- if WAYPT_HAS(wpt, course) {
- *course = wpt->course;
- }
-
-}
-
-/* pre-calculation callbacks */
-
-static void
-any_hdr_calc_cb(const route_head* trk)
-{
-
- trkpt_out = nullptr;
- this_distance = 0;
- this_time = 0;
- this_points = 0;
-
- this_index++;
- this_valid = ((opt_route_index_value < 1) || (opt_route_index_value == this_index));
- if (! this_valid) {
- return;
- }
-
- if (rte_name.isEmpty() && !trk->rte_name.isEmpty()) {
- rte_name = trk->rte_name;
- rte_desc = trk->rte_desc;
- }
-
- trk_out = trk;
-}
-
-static void
-any_waypt_calc_cb(const Waypoint* wpt)
-{
- double speed, course, dist;
-
- /* we can only write ONE route */
- if (! this_valid) {
- return;
- }
-
- if ((all_points == 0) && (this_points == 0)) {
- start_time = wpt->GetCreationTime().toTime_t();
- }
-
- this_points++;
-
- if ((wpt->altitude != unknown_alt) && (wpt->altitude < minalt)) {
- minalt = wpt->altitude;
- }
- if ((wpt->altitude != unknown_alt) && (wpt->altitude > maxalt)) {
- maxalt = wpt->altitude;
- }
- calculate(wpt, &dist, &speed, &course, &all_asc, &all_desc);
- if (speed > maxspeed) {
- maxspeed = speed;
- }
-
- this_distance = this_distance + dist;
- if (trkpt_out != nullptr) {
- this_time += (wpt->GetCreationTime().toTime_t() - trkpt_out->GetCreationTime().toTime_t());
- }
-
- trkpt_out = wpt;
-}
-
-static void
-any_tlr_calc_cb(const route_head*)
-{
- if (! this_valid) {
- return;
- }
-
- all_dist += this_distance;
- all_time += this_time;
- all_points += this_points;
-}
-
-/* write callbacks */
-
-static void
-track_disp_hdr_cb(const route_head* trk)
-{
- track_index++;
- track_points = 0;
- trk_out = trk;
- trkpt_out = nullptr;
-}
-
-
-static void
-track_disp_wpt_cb(const Waypoint* wpt)
-{
- struct tm tm;
- char tbuf[32];
- double course, speed, dist;
- int flag = 0;
-
- track_points++;
- all_track_points++;
-
- time_t ct = wpt->GetCreationTime().toTime_t();
- tm = *localtime(&ct);
- strftime(tbuf, sizeof(tbuf), "%d.%m.%Y,%H:%M.%S", &tm);
-
- calculate(wpt, &dist, &speed, &course, nullptr, nullptr);
- trkpt_dist = trkpt_dist + dist;
-
- if (track_points == trk_out->rte_waypt_ct()) { /* I'm the last in that list */
- if (all_track_points != saved_track_points) { /* but not the overall latest */
- flag = 1;
- }
- } else if (track_points == 1) { /* I'm the first in that list */
- if (all_track_points > 1) { /* but not the first ever seen */
- flag = 2;
- }
- }
-
- if (flag == 1) {
- QString name = wpt->shortname;
- if (name == nullptr) {
- name = "Log paused";
- }
- gbfprintf(fout, "\"MP\",\"%s\"", CSTR(name));
- } else if (flag == 2) {
- QString name = wpt->shortname;
- if (name == nullptr) {
- name = "Log continued";
- }
- gbfprintf(fout, "\"MP\",\"%s\"", CSTR(name));
- } else {
- gbfprintf(fout, "\"TP\"");
- }
-
- gbfprintf(fout, ",%s,%.6lf,%.6lf,%.f,%.2f",
- tbuf,
- wpt->latitude, wpt->longitude, ALT(wpt), speed);
- if (flag) {
- gbfprintf(fout, ",0,0,%d", flag); /* press, temperature, memory point type */
- } else {
- gbfprintf(fout, ",%.1f", course);
- }
-
- if (trkpt_dist != 0) {
- gbfprintf(fout, ",%.6f\n", trkpt_dist);
- } else {
- gbfprintf(fout, ",0\n");
- }
-
- trkpt_out = wpt;
-}
-
-static void
-track_disp_tlr_cb(const route_head*)
-{
- trkpt_out = nullptr;
-}
-
-static void
-route_disp_hdr_cb(const route_head*)
-{
- route_index++;
- this_route_valid = ((opt_route_index_value < 1) || (opt_route_index_value == track_index));
-}
-
-static void
-route_disp_wpt_cb(const Waypoint* wpt)
-{
- if (this_route_valid) {
- QString sn;
-
- if (global_opts.synthesize_shortnames) {
- sn = mkshort_from_wpt(short_h, wpt);
- } else {
- sn = mkshort(short_h, wpt->shortname);
- }
- gbfprintf(fout, "\"WP\",\"%s\",%.8lf,%.8lf,%.f\n",
- CSTR(sn), wpt->latitude, wpt->longitude, ALT(wpt));
- }
-}
-
-static void
-track_disp_custom_cb(const Waypoint* wpt)
-{
- if (wpt->GetCreationTime().isValid() && (wpt->altitude != unknown_alt)) {
- gbfprintf(fout, "%d,%.f\n", (int)(wpt->GetCreationTime().toTime_t() - start_time), wpt->altitude);
- }
-}
-
-static void
-wr_init(const QString& fname)
-{
- fout = gbfopen(fname, "w", MYNAME);
- short_h = mkshort_new_handle();
-}
-
-static void
-wr_deinit()
-{
- mkshort_del_handle(&short_h);
- gbfclose(fout);
-}
-
-static void
-data_write()
-{
- gbfprintf(fout, "[HEADER]\n");
- gbfprintf(fout, "FILEVERSION=1\n");
- gbfprintf(fout, "SOURCE=FILE\n");
- gbfprintf(fout, "DATUM=WGS84\n");
-
- rte_name = QString();
- rte_desc = QString();
- trkpt_out = nullptr;
- opt_route_index_value = -1; /* take all tracks from data pool */
- track_index = 0;
- minalt = -unknown_alt;
- maxalt = unknown_alt;
- maxspeed = 0;
- all_dist = 0;
- all_time = 0;
- all_asc = 0;
- all_desc = 0;
- all_points = 0;
- start_time = 0;
-
- setshort_length(short_h, 100);
- setshort_badchars(short_h, "\r\n");
- setshort_mustupper(short_h, 0);
- setshort_mustuniq(short_h, 0);
- setshort_whitespace_ok(short_h, 1);
- setshort_repeating_whitespace_ok(short_h, 1);
-
- switch (global_opts.objective) {
- case wptdata:
- case unknown_gpsdata:
- break;
-
- case rtedata:
- gbfprintf(fout, "TYPE=5\n");
-
- opt_route_index_value = atoi(opt_route_index);
- route_disp_all(any_hdr_calc_cb, any_tlr_calc_cb, any_waypt_calc_cb);
- gbfprintf(fout, "DISTANCE=%.f\n", all_dist);
- if (!rte_name.isEmpty()) {
- gbfprintf(fout, "NAME=%s\n", CSTR(rte_name));
- }
- gbfprintf(fout, "[POINTS]\n");
- if (route_points > 0) {
- track_index = 0;
- route_disp_all(route_disp_hdr_cb, nullptr, route_disp_wpt_cb);
- }
- break;
-
- case trkdata:
- gbfprintf(fout, "TYPE=28\n");
-
- track_disp_all(any_hdr_calc_cb, any_tlr_calc_cb, any_waypt_calc_cb);
- if (all_track_points > 0) {
- if (!rte_name.isEmpty()) {
- gbfprintf(fout, "NAME=%s\n", CSTR(rte_name));
- }
- if (minalt != -unknown_alt) {
- gbfprintf(fout, "MINALT=%.f\n", minalt);
- }
- if (maxalt != unknown_alt) {
- gbfprintf(fout, "MAXALT=%.f\n", maxalt);
- }
- gbfprintf(fout, "MAXSPEED=%.2f\n", maxspeed);
- gbfprintf(fout, "DISTANCE=%.f\n", all_dist);
- gbfprintf(fout, "DURATION=%lu\n", all_time);
-// gbfprintf(fout, "TOTASC=%.f\n", all_asc);
-// gbfprintf(fout, "TOTDSC=%.f\n", all_desc);
- if (start_time) {
- struct tm tm;
- char tbuf[32];
-
- tm = *localtime(&start_time);
- strftime(tbuf, sizeof(tbuf), "%d.%m.%Y %H:%M.%S", &tm);
- gbfprintf(fout, "DATE=%s\n", tbuf);
- }
- if (all_time) {
- gbfprintf(fout, "AVGSPEED=%.2f\n", all_dist / (double)all_time);
- }
- }
- gbfprintf(fout, "[POINTS]\n");
- if (all_track_points > 0) {
-
- trkpt_dist = 0;
- saved_track_points = all_track_points;
- all_track_points = 0;
- track_disp_all(track_disp_hdr_cb, track_disp_tlr_cb, track_disp_wpt_cb);
-
- if (start_time) {
- gbfprintf(fout, "[CUSTOM1]\n");
- track_index = 0;
- track_disp_all(nullptr, nullptr, track_disp_custom_cb);
- }
- }
- break;
- case posndata:
- fatal(MYNAME ": Realtime positioning not supported.\n");
- break;
- }
-}
-
-/* ------------------------------------------------------------------ */
-
-ff_vecs_t stmsdf_vecs = {
- ff_type_file,
- {
- ff_cap_none,
- (ff_cap)(ff_cap_read | ff_cap_write),
- (ff_cap)(ff_cap_read | ff_cap_write)
- },
- rd_init,
- wr_init,
- rd_deinit,
- wr_deinit,
- data_read,
- data_write,
- nullptr,
- &stmsdf_args,
- CET_CHARSET_MS_ANSI, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
-
-/* ================================================================== */
-
-#endif /* CSVFMTS_ENABLED */
-
+++ /dev/null
-/*
-
- Support for "Suunto Trek Manager" (STM) WaypointPlus files,
- see homepage "http://www.suunto.fi" for more details,
-
- Copyright (C) 2005,2007 Olaf Klein, o.b.klein@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-#include <cstdio> // for sscanf, snprintf
-#include <cstdlib> // for atof, atoi
-#include <cstring> // for memset
-#include <ctime> // for tm
-
-#include <QDateTime> // for QDateTime
-#include <QString> // for QString
-#include <QTime> // for QTime
-#include <QVector> // for QVector
-
-#include "defs.h"
-#include "cet_util.h" // for cet_convert_init
-#include "csv_util.h" // for csv_lineparse
-#include "gbfile.h" // for gbfprintf, gbfclose, gbfgetstr, gbfopen, gbfile, gbfputs
-#include "src/core/datetime.h" // for DateTime
-
-
-#if CSVFMTS_ENABLED
-
-static gbfile* fin, *fout;
-static route_head* track, *route;
-static Waypoint* wpt;
-static short_handle short_h;
-
-#define MYNAME "STMwpp"
-
-#define STM_NOTHING 0
-#define STM_WAYPT 1
-#define STM_TRKPT 2
-#define STM_RTEPT 3
-
-static int track_index;
-static int track_num;
-static int what;
-
-static char* index_opt = nullptr;
-
-static
-QVector<arglist_t> stmwpp_args = {
- {
- "index", &index_opt, "Index of route/track to write (if more than one in source)",
- nullptr, ARGTYPE_INT, "1", nullptr, nullptr
- },
-};
-
-
-static void
-stmwpp_rd_init(const QString& fname)
-{
- fin = gbfopen(fname, "rb", MYNAME);
- track = nullptr;
- route = nullptr;
- wpt = nullptr;
-}
-
-static void
-stmwpp_rd_deinit()
-{
- gbfclose(fin);
-}
-
-static void
-stmwpp_data_read()
-{
- int line = 0;
-
- what = STM_NOTHING;
- char* buff = gbfgetstr(fin);
- buff = (buff == nullptr) ? (char*) "" : buff;
-
- if (case_ignore_strncmp(buff, "Datum,WGS 84,WGS 84,", 20) != 0) {
- fatal(MYNAME ": Invalid GPS datum or not \"WaypointPlus\"\" file!\n");
- }
-
- while ((buff = gbfgetstr(fin))) {
- char* c;
- int column = -1;
- struct tm time;
-
- if ((line++ == 0) && fin->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
-
- buff = lrtrim(buff);
- if (*buff == '\0') {
- continue;
- }
-
- wpt = nullptr;
- memset(&time, 0, sizeof(time));
- int milliseconds = 0;
-
- while ((c = csv_lineparse(buff, ",", "", column++))) {
- int new_what;
-
- buff = nullptr;
-
- switch (column) {
- case 0:
- if (case_ignore_strcmp(c, "WP") == 0) {
- new_what = STM_WAYPT;
- } else if (case_ignore_strcmp(c, "TP") == 0) {
- new_what = STM_TRKPT;
- } else {
- fatal(MYNAME ": Unknown feature \"%s\"!\n", c);
- }
-
- if ((what != STM_NOTHING) && (new_what != what)) {
- fatal(MYNAME ": Only one feature (route or track) is supported by STM!\n");
- }
-
- what = new_what;
- wpt = new Waypoint;
- break;
-
- case 1:
- if (what == STM_TRKPT) {
- column++; /* no name -> skip column two */
- }
- break;
-
- case 2:
- wpt->shortname = QString::fromLatin1(c);
- break;
-
- case 3:
- wpt->latitude = atof(c);
- break;
-
- case 4:
- wpt->longitude = atof(c);
- break;
-
- case 5:
- sscanf(c, "%d/%d/%d", &time.tm_mon, &time.tm_mday, &time.tm_year);
- break;
-
- case 6:
- sscanf(c, "%d:%d:%d.%d", &time.tm_hour, &time.tm_min, &time.tm_sec, &milliseconds);
- /* makes sense only for recorded trackpoints */
- if (what != STM_TRKPT) {
- milliseconds = 0;
- }
- break;
-
- default:
- break;
- }
- }
- if (wpt != nullptr) {
- time.tm_year -= 1900;
- time.tm_mon--;
- wpt->SetCreationTime(mkgmtime(&time), milliseconds);
-
- switch (what) {
- case STM_WAYPT:
- waypt_add(wpt);
- if (global_opts.objective == rtedata) {
- if (route == nullptr) {
- route = new route_head;
- route_add_head(route);
- }
- route_add_wpt(route, new Waypoint(*wpt));
- }
- break;
-
- case STM_TRKPT:
- if (track == nullptr) {
- track = new route_head;
- track_add_head(track);
- }
- track_add_wpt(track, wpt);
- break;
- }
- wpt = nullptr;
- }
- }
-}
-
-static void
-stmwpp_rw_init(const QString& fname)
-{
- fout = gbfopen(fname, "wb", MYNAME);
- short_h = mkshort_new_handle();
-}
-
-static void
-stmwpp_rw_deinit()
-{
- mkshort_del_handle(&short_h);
- gbfclose(fout);
-}
-
-static void
-stmwpp_track_hdr(const route_head*)
-{
- track_num++;
-}
-
-static void
-stmwpp_write_double(const double val)
-{
- char buff[64];
-
- char* c = buff + snprintf(buff, sizeof(buff), "%3.7f", val);
- while (*--c == '0') {
- *c = '\0';
- }
- if (*c == '.') {
- *++c = '0';
- }
- gbfprintf(fout, "%s,", buff);
-}
-
-static void
-stmwpp_waypt_cb(const Waypoint* waypoint)
-{
- if (track_index != track_num) {
- return;
- }
-
- QString sn;
- switch (what) {
-
- case STM_WAYPT:
- case STM_RTEPT:
- if (global_opts.synthesize_shortnames) {
- sn = mkshort_from_wpt(short_h, waypoint);
- } else {
- sn = mkshort(short_h, waypoint->shortname);
- }
- gbfprintf(fout, "WP,D,%s,", CSTRc(sn));
- break;
-
- case STM_TRKPT:
- gbfprintf(fout, "TP,D,");
- break;
- }
- stmwpp_write_double(waypoint->latitude);
- stmwpp_write_double(waypoint->longitude);
- QString datetime = waypoint->GetCreationTime().toUTC().toString("MM/dd/yyyy,HH:mm:ss");
- gbfputs(datetime, fout);
- switch (what) {
- case STM_WAYPT:
- case STM_RTEPT:
- gbfprintf(fout, ".%02d", 0);
- break;
- case STM_TRKPT:
- gbfprintf(fout, ".%03d", waypoint->GetCreationTime().time().msec());
- break;
- }
- gbfprintf(fout, ",\r\n");
-}
-
-static void
-stmwpp_data_write()
-{
- setshort_length(short_h, 100);
- setshort_badchars(short_h, ",\r\n");
- setshort_mustupper(short_h, 0);
- setshort_mustuniq(short_h, 0);
- setshort_whitespace_ok(short_h, 1);
- setshort_repeating_whitespace_ok(short_h, 1);
-
- track_num = 0;
- if (index_opt != nullptr) {
- track_index = atoi(index_opt);
- } else {
- track_index = 1;
- }
-
- gbfprintf(fout, "Datum,WGS 84,WGS 84,0,0,0,0,0\r\n");
-
- switch (global_opts.objective) {
- case wptdata:
- case unknown_gpsdata:
- what = STM_WAYPT;
- track_index = track_num; /* disable filter */
- setshort_defname(short_h, "WPT");
- waypt_disp_all(stmwpp_waypt_cb);
- break;
- case rtedata:
- what = STM_RTEPT;
- setshort_defname(short_h, "RPT");
- route_disp_all(stmwpp_track_hdr, nullptr, stmwpp_waypt_cb);
- break;
- case trkdata:
- what = STM_TRKPT;
- track_disp_all(stmwpp_track_hdr, nullptr, stmwpp_waypt_cb);
- break;
- case posndata:
- fatal(MYNAME ": Realtime positioning not supported.\n");
- break;
- }
-}
-
-ff_vecs_t stmwpp_vecs = {
- ff_type_file,
- FF_CAP_RW_ALL,
- stmwpp_rd_init,
- stmwpp_rw_init,
- stmwpp_rd_deinit,
- stmwpp_rw_deinit,
- stmwpp_data_read,
- stmwpp_data_write,
- nullptr,
- &stmwpp_args,
- CET_CHARSET_MS_ANSI, 0
- , NULL_POS_OPS,
- nullptr
-};
-
-#endif /* CSVFMTS_ENABLED */
-
+++ /dev/null
-# gpsbabel XCSV style file
-#
-# Format: GPSMAN Format
-# Author: Alex Mottram
-# Date: 12/09/2002
-#
-#
-# As defined in gpsman.c
-#
-#
-
-DESCRIPTION GPSman
-SHORTLEN 8
-SHORTWHITE 0
-
-# FILE LAYOUT DEFINITIIONS:
-#
-FIELD_DELIMITER TAB
-RECORD_DELIMITER NEWLINE
-BADCHARS TAB
-
-PROLOGUE !Format: DDD 1 WGS 84
-PROLOGUE !W:
-
-#
-# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
-#
-IFIELD SHORTNAME, "", "%-8.8s"
-IFIELD DESCRIPTION, "", "%s"
-IFIELD LAT_DIRDECIMAL, "", "%c%f"
-IFIELD LON_DIRDECIMAL, "", "%c%f"
-IFIELD IGNORE, "", "%s"
-
-# gpsman.c likes mkshort len = 8, whitespace = 0.
compare ${REFERENCE}/wbt-201.gpx ${TMPDIR}/wbt-201.gpx2
#
-# gzipped file i/o
+# gzipped file i/o (reading only)
#
-gpsbabel -i compegps -f ${REFERENCE}/compegps.wpt.gz -o gpx -F ${TMPDIR}/compegps-wpt.gpx
-compare ${REFERENCE}/compegps-wpt.gpx ${TMPDIR}/compegps-wpt.gpx
+gpsbabel -i nmea -f ${REFERENCE}/waypoints.nmea.gz -o nmea -F ${TMPDIR}/waypoints.nmea
+compare ${REFERENCE}/waypoints.nmea ${TMPDIR}/waypoints.nmea
#
# GPX version detection
+++ /dev/null
-#
-# CompeGPS I/O tests
-#
-rm -f ${TMPDIR}/compegps*
-# read (CompeGPS)
-gpsbabel -i compegps -f ${REFERENCE}/compegps.wpt -o gpx -F ${TMPDIR}/compegps-wpt.gpx
-compare ${REFERENCE}/compegps-wpt.gpx ${TMPDIR}/compegps-wpt.gpx
-gpsbabel -i compegps -f ${REFERENCE}/route/compegps.rte -o gpx -F ${TMPDIR}/compegps-rte.gpx
-compare ${REFERENCE}/route/compegps-rte.gpx ${TMPDIR}/compegps-rte.gpx
-gpsbabel -i compegps -f ${REFERENCE}/track/compegps.trk -o gpx -F ${TMPDIR}/compegps-trk.gpx
-compare ${REFERENCE}/track/compegps-trk.gpx ${TMPDIR}/compegps-trk.gpx
-# write (CompeGPS)
-gpsbabel -i compegps -f ${REFERENCE}/compegps.wpt -o compegps -F ${TMPDIR}/compegps.wpt
-gpsbabel -i compegps -f ${TMPDIR}/compegps.wpt -o gpx -F ${TMPDIR}/compegps-wpt2.gpx
-compare ${REFERENCE}/compegps-wpt.gpx ${TMPDIR}/compegps-wpt2.gpx
-
-gpsbabel -i compegps -f ${REFERENCE}/compegps_time.wpt -o gpx -F ${TMPDIR}/compegps_time.gpx
-compare ${REFERENCE}/compegps_time_wpt.gpx ${TMPDIR}/compegps_time.gpx
-
-
-gpsbabel -t -i compegps -f ${REFERENCE}/track/compegps.trk -o compegps -F ${TMPDIR}/compegps.trk
-gpsbabel -i compegps -f ${TMPDIR}/compegps.trk -o gpx -F ${TMPDIR}/compegps-trk2.gpx
-compare ${REFERENCE}/track/compegps-trk.gpx ${TMPDIR}/compegps-trk2.gpx
-
-gpsbabel -r -i compegps -f ${REFERENCE}/route/compegps.rte -o compegps -F ${TMPDIR}/compegps.rte
-gpsbabel -i compegps -f ${TMPDIR}/compegps.rte -o gpx -F ${TMPDIR}/compegps-rte2.gpx
-compare ${REFERENCE}/route/compegps-rte.gpx ${TMPDIR}/compegps-rte2.gpx
-
+++ /dev/null
-
-# CSV (Comma separated value) data.
-
-gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o csv -F ${TMPDIR}/csv.csv
-gpsbabel -i csv -f ${TMPDIR}/csv.csv -o csv -F ${TMPDIR}/csv2.csv
-compare ${TMPDIR}/csv2.csv ${TMPDIR}/csv.csv
-# And the alternate command line version.
-gpsbabel -i csv -o gpx ${TMPDIR}/csv.csv ${TMPDIR}/csv3.gpx
-gpsbabel -i gpx -o csv ${TMPDIR}/csv3.gpx ${TMPDIR}/csv4.csv
-compare ${TMPDIR}/csv.csv ${TMPDIR}/csv4.csv
-
-# flip lat and lon so we can distiguish which style file got used.
-echo '# and an internal xcsv and external xcsv.' >> ${TMPDIR}/csvb.style
-echo '# gpsbabel XCSV style file' >> ${TMPDIR}/csvb.style
-echo '#' >> ${TMPDIR}/csvb.style
-echo '# Format: DeLorme SA 9.0 CSV' >> ${TMPDIR}/csvb.style
-echo '# Author: Alex Mottram' >> ${TMPDIR}/csvb.style
-echo '# Date: 12/09/2002' >> ${TMPDIR}/csvb.style
-echo '#' >> ${TMPDIR}/csvb.style
-echo '#' >> ${TMPDIR}/csvb.style
-echo 'DESCRIPTION Comma separated values' >> ${TMPDIR}/csvb.style
-echo 'SHORTLEN 8' >> ${TMPDIR}/csvb.style
-echo '#' >> ${TMPDIR}/csvb.style
-echo '#' >> ${TMPDIR}/csvb.style
-echo '# FILE LAYOUT DEFINITIIONS:' >> ${TMPDIR}/csvb.style
-echo '#' >> ${TMPDIR}/csvb.style
-echo 'FIELD_DELIMITER COMMASPACE' >> ${TMPDIR}/csvb.style
-echo 'RECORD_DELIMITER NEWLINE' >> ${TMPDIR}/csvb.style
-echo 'BADCHARS COMMA' >> ${TMPDIR}/csvb.style
-echo '' >> ${TMPDIR}/csvb.style
-echo '#' >> ${TMPDIR}/csvb.style
-echo '# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:' >> ${TMPDIR}/csvb.style
-echo '#' >> ${TMPDIR}/csvb.style
-echo 'IFIELD LON_HUMAN_READABLE, "", "%08.5f"' >> ${TMPDIR}/csvb.style
-echo 'IFIELD LAT_HUMAN_READABLE, "", "%08.5f"' >> ${TMPDIR}/csvb.style
-echo 'IFIELD DESCRIPTION, "", "%s"' >> ${TMPDIR}/csvb.style
-echo '' >> ${TMPDIR}/csvb.style
-echo 'OFIELD LON_DECIMAL, "", "%08.5f"' >> ${TMPDIR}/csvb.style
-echo 'OFIELD LAT_DECIMAL, "", "%08.5f"' >> ${TMPDIR}/csvb.style
-echo 'OFIELD DESCRIPTION, "", "%s"' >> ${TMPDIR}/csvb.style
-
-# make sure we can follow an internal format with an explict style on read.
-gpsbabel -i csv -f ${TMPDIR}/csv.csv -i xcsv,style=${TMPDIR}/csvb.style -f ${TMPDIR}/csv.csv -o gpx -F ${TMPDIR}/csv_csvb.gpx
-compare ${REFERENCE}/csv_csvb.gpx ${TMPDIR}/csv_csvb.gpx
-# make sure we remember the style file if we don't give a second -i.
-gpsbabel -i csv -f ${TMPDIR}/csv.csv -f ${TMPDIR}/csv.csv -o gpx -F ${TMPDIR}/csv_csv.gpx
-compare ${REFERENCE}/csv_csv.gpx ${TMPDIR}/csv_csv.gpx
-# make sure we can follow a internal format with an explict style on write.
-gpsbabel -i csv -f ${TMPDIR}/csv.csv -o xcsv,style=${TMPDIR}/csvb.style -F ${TMPDIR}/csvb.csv
-compare ${REFERENCE}/csvb.csv ${TMPDIR}/csvb.csv
-
--- /dev/null
+#
+# CompeGPS I/O tests
+#
+rm -f ${TMPDIR}/compegps*
+# read (CompeGPS)
+gpsbabel -i compegps -f ${REFERENCE}/compegps.wpt -o gpx -F ${TMPDIR}/compegps-wpt.gpx
+compare ${REFERENCE}/compegps-wpt.gpx ${TMPDIR}/compegps-wpt.gpx
+gpsbabel -i compegps -f ${REFERENCE}/route/compegps.rte -o gpx -F ${TMPDIR}/compegps-rte.gpx
+compare ${REFERENCE}/route/compegps-rte.gpx ${TMPDIR}/compegps-rte.gpx
+gpsbabel -i compegps -f ${REFERENCE}/track/compegps.trk -o gpx -F ${TMPDIR}/compegps-trk.gpx
+compare ${REFERENCE}/track/compegps-trk.gpx ${TMPDIR}/compegps-trk.gpx
+# write (CompeGPS)
+gpsbabel -i compegps -f ${REFERENCE}/compegps.wpt -o compegps -F ${TMPDIR}/compegps.wpt
+gpsbabel -i compegps -f ${TMPDIR}/compegps.wpt -o gpx -F ${TMPDIR}/compegps-wpt2.gpx
+compare ${REFERENCE}/compegps-wpt.gpx ${TMPDIR}/compegps-wpt2.gpx
+
+gpsbabel -i compegps -f ${REFERENCE}/compegps_time.wpt -o gpx -F ${TMPDIR}/compegps_time.gpx
+compare ${REFERENCE}/compegps_time_wpt.gpx ${TMPDIR}/compegps_time.gpx
+
+
+gpsbabel -t -i compegps -f ${REFERENCE}/track/compegps.trk -o compegps -F ${TMPDIR}/compegps.trk
+gpsbabel -i compegps -f ${TMPDIR}/compegps.trk -o gpx -F ${TMPDIR}/compegps-trk2.gpx
+compare ${REFERENCE}/track/compegps-trk.gpx ${TMPDIR}/compegps-trk2.gpx
+
+gpsbabel -r -i compegps -f ${REFERENCE}/route/compegps.rte -o compegps -F ${TMPDIR}/compegps.rte
+gpsbabel -i compegps -f ${TMPDIR}/compegps.rte -o gpx -F ${TMPDIR}/compegps-rte2.gpx
+compare ${REFERENCE}/route/compegps-rte.gpx ${TMPDIR}/compegps-rte2.gpx
+
--- /dev/null
+
+# CSV (Comma separated value) data.
+
+gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o csv -F ${TMPDIR}/csv.csv
+gpsbabel -i csv -f ${TMPDIR}/csv.csv -o csv -F ${TMPDIR}/csv2.csv
+compare ${TMPDIR}/csv2.csv ${TMPDIR}/csv.csv
+# And the alternate command line version.
+gpsbabel -i csv -o gpx ${TMPDIR}/csv.csv ${TMPDIR}/csv3.gpx
+gpsbabel -i gpx -o csv ${TMPDIR}/csv3.gpx ${TMPDIR}/csv4.csv
+compare ${TMPDIR}/csv.csv ${TMPDIR}/csv4.csv
+
+# flip lat and lon so we can distiguish which style file got used.
+echo '# and an internal xcsv and external xcsv.' >> ${TMPDIR}/csvb.style
+echo '# gpsbabel XCSV style file' >> ${TMPDIR}/csvb.style
+echo '#' >> ${TMPDIR}/csvb.style
+echo '# Format: DeLorme SA 9.0 CSV' >> ${TMPDIR}/csvb.style
+echo '# Author: Alex Mottram' >> ${TMPDIR}/csvb.style
+echo '# Date: 12/09/2002' >> ${TMPDIR}/csvb.style
+echo '#' >> ${TMPDIR}/csvb.style
+echo '#' >> ${TMPDIR}/csvb.style
+echo 'DESCRIPTION Comma separated values' >> ${TMPDIR}/csvb.style
+echo 'SHORTLEN 8' >> ${TMPDIR}/csvb.style
+echo '#' >> ${TMPDIR}/csvb.style
+echo '#' >> ${TMPDIR}/csvb.style
+echo '# FILE LAYOUT DEFINITIIONS:' >> ${TMPDIR}/csvb.style
+echo '#' >> ${TMPDIR}/csvb.style
+echo 'FIELD_DELIMITER COMMASPACE' >> ${TMPDIR}/csvb.style
+echo 'RECORD_DELIMITER NEWLINE' >> ${TMPDIR}/csvb.style
+echo 'BADCHARS COMMA' >> ${TMPDIR}/csvb.style
+echo '' >> ${TMPDIR}/csvb.style
+echo '#' >> ${TMPDIR}/csvb.style
+echo '# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:' >> ${TMPDIR}/csvb.style
+echo '#' >> ${TMPDIR}/csvb.style
+echo 'IFIELD LON_HUMAN_READABLE, "", "%08.5f"' >> ${TMPDIR}/csvb.style
+echo 'IFIELD LAT_HUMAN_READABLE, "", "%08.5f"' >> ${TMPDIR}/csvb.style
+echo 'IFIELD DESCRIPTION, "", "%s"' >> ${TMPDIR}/csvb.style
+echo '' >> ${TMPDIR}/csvb.style
+echo 'OFIELD LON_DECIMAL, "", "%08.5f"' >> ${TMPDIR}/csvb.style
+echo 'OFIELD LAT_DECIMAL, "", "%08.5f"' >> ${TMPDIR}/csvb.style
+echo 'OFIELD DESCRIPTION, "", "%s"' >> ${TMPDIR}/csvb.style
+
+# make sure we can follow an internal format with an explict style on read.
+gpsbabel -i csv -f ${TMPDIR}/csv.csv -i xcsv,style=${TMPDIR}/csvb.style -f ${TMPDIR}/csv.csv -o gpx -F ${TMPDIR}/csv_csvb.gpx
+compare ${REFERENCE}/csv_csvb.gpx ${TMPDIR}/csv_csvb.gpx
+# make sure we remember the style file if we don't give a second -i.
+gpsbabel -i csv -f ${TMPDIR}/csv.csv -f ${TMPDIR}/csv.csv -o gpx -F ${TMPDIR}/csv_csv.gpx
+compare ${REFERENCE}/csv_csv.gpx ${TMPDIR}/csv_csv.gpx
+# make sure we can follow a internal format with an explict style on write.
+gpsbabel -i csv -f ${TMPDIR}/csv.csv -o xcsv,style=${TMPDIR}/csvb.style -F ${TMPDIR}/csvb.csv
+compare ${REFERENCE}/csvb.csv ${TMPDIR}/csvb.csv
+
--- /dev/null
+#
+# G7ToWin (read only) test
+#
+gpsbabel -i g7towin -f ${REFERENCE}/expertgps.g7t -o garmin_txt,utc=0 -F ${TMPDIR}/expertgps-g7t.txt
+compare ${REFERENCE}/expertgps-g7t.txt ${TMPDIR}/expertgps-g7t.txt
--- /dev/null
+# GoPal
+# GoPal is a bit tricky, because it's a lossy format regarding the first field (timetick).
+# so we first read a reference gopal file, and then write it out as gopal trk file, now with a computed timestamp.
+# Doing so results in more useful timestamps.
+# Next we convert this tst file to gpx to test the writing path, but gpx does not save speed, so do it twice...
+GoPalName=track20080703_173036.trk
+rm -f ${TMPDIR}/${GoPalName}.*
+#step 1: reference file
+gpsbabel -i gopal -f ${REFERENCE}/track20080703_173036.trk -o gopal -F ${TMPDIR}/${GoPalName}.tst
+#step2: gpx without speed information
+gpsbabel -i gopal -f ${TMPDIR}/${GoPalName}.tst -o gpx -F ${TMPDIR}/${GoPalName}.im
+gpsbabel -i gpx -f ${TMPDIR}/${GoPalName}.im -o gopal -F ${TMPDIR}/${GoPalName}.tst2
+#step 3: do it again to have 2 identical gopal files:
+gpsbabel -i gopal -f ${TMPDIR}/${GoPalName}.tst -o gpx -F ${TMPDIR}/${GoPalName}.im2
+gpsbabel -i gpx -f ${TMPDIR}/${GoPalName}.im2 -o gopal -F ${TMPDIR}/${GoPalName}.tst3
+compare ${TMPDIR}/${GoPalName}.tst2 ${TMPDIR}/${GoPalName}.tst3
+
+# Gopal with 11 fields is slightly more sane.
+gpsbabel -i gopal -f ${REFERENCE}/gopal-11.trk -o gpx -F ${TMPDIR}/gopal-11-gpx.gpx
+compare ${REFERENCE}/gopal-11-gpx.gpx ${TMPDIR}/gopal-11-gpx.gpx
+
--- /dev/null
+# GPSUtil
+rm -f ${TMPDIR}/gu.wpt ${TMPDIR}/1.gpx ${TMPDIR}/2.gpx
+gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o gpsutil -F ${TMPDIR}/gu.wpt
+compare ${TMPDIR}/gu.wpt ${REFERENCE}
+gpsbabel -i gpsutil -f ${TMPDIR}/gu.wpt -o gpx -F ${TMPDIR}/1.gpx
+gpsbabel -i gpsutil -f ${REFERENCE}/gu.wpt -o gpx -F ${TMPDIR}/2.gpx
+compare ${TMPDIR}/1.gpx ${TMPDIR}/2.gpx
--- /dev/null
+#
+# Jelbert GeoTagger JTR data files
+#
+gpsbabel -i jtr -f ${REFERENCE}/track/expertgps.jtr -o gpx -F ${TMPDIR}/expertgps~jtr.gpx -o jtr -F ${TMPDIR}/expertgps~jtr.jtr
+compare ${REFERENCE}/track/expertgps~jtr.gpx ${TMPDIR}/expertgps~jtr.gpx
+compare ${REFERENCE}/track/expertgps.jtr ${TMPDIR}/expertgps~jtr.jtr
+
--- /dev/null
+
+#
+# Magellan Explorist geocaching format (write-only).
+#
+gpsbabel -i gpx -f ${REFERENCE}/gc/GC7FA4.gpx -f ${REFERENCE}/gc/GCGCA8.gpx -o maggeo -F ${TMPDIR}/maggeo.gs
+compare ${REFERENCE}/gc/maggeo.gs ${TMPDIR}/maggeo.gs
+
+gpsbabel -i maggeo -f ${REFERENCE}/gc/maggeo.gs -o maggeo -F ${TMPDIR}/maggeo2.gs
+compare ${REFERENCE}/gc/maggeo.gs ${TMPDIR}/maggeo2.gs
--- /dev/null
+# Magellan Mapsend
+rm -f ${TMPDIR}/mm.mapsend ${TMPDIR}/mm.gps
+gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o mapsend -F ${TMPDIR}/mm.mapsend
+gpsbabel -i mapsend -f ${TMPDIR}/mm.mapsend -o gpsutil -F ${TMPDIR}/mm.gps
+compare ${TMPDIR}/mm.gps ${REFERENCE}/gu.wpt
+
+#
+# MAPSEND waypoint / route format
+#
+rm -f ${TMPDIR}/route.mapsend
+gpsbabel -r -i mapsend -f ${REFERENCE}/route/route.mapsend -o mapsend \
+ -F ${TMPDIR}/route.mapsend
+bincompare ${TMPDIR}/route.mapsend ${REFERENCE}/route/route.mapsend
+
+#
+# MAPSEND track format
+#
+rm -f ${TMPDIR}/mapsend.trk
+gpsbabel -t -i mapsend -f ${REFERENCE}/track/mapsend.trk -o mapsend,trkver=3 \
+ -F ${TMPDIR}/mapsend.trk
+compare ${TMPDIR}/mapsend.trk ${REFERENCE}/track/
+
--- /dev/null
+#
+# mtk_locus logger tests
+#
+FORMAT=mtk_locus
+
+rm -f ${TMPDIR}/$FORMAT.*
+
+gpsbabel -i $FORMAT -f ${REFERENCE}/$FORMAT.nmea -o gpx -F ${TMPDIR}/$FORMAT.gpx >/dev/null
+compare ${REFERENCE}/$FORMAT.gpx ${TMPDIR}/$FORMAT.gpx
--- /dev/null
+
+#
+# Navigon Mobile Navigator .rte tests
+#
+rm -f ${TMPDIR}/nmn4-sample*
+gpsbabel -i nmn4 -f ${REFERENCE}/route/nmn4-sample.rte -o gpx -F ${TMPDIR}/nmn4-sample.gpx
+compare ${REFERENCE}/route/nmn4-sample.gpx ${TMPDIR}/nmn4-sample.gpx
+gpsbabel -i gpx -f ${REFERENCE}/route/nmn4-sample.gpx -o nmn4 -F ${TMPDIR}/nmn4-sample-out.rte
+compare ${REFERENCE}/route/nmn4-sample-out.rte ${TMPDIR}/nmn4-sample-out.rte
--- /dev/null
+# PCX (Garmin mapsource import) file format
+rm -f ${TMPDIR}/mm.pcx ${TMPDIR}/pcx.gps
+gpsbabel -i gpx -f ${REFERENCE}/geocaching.gpx -o pcx -F ${TMPDIR}/mm.pcx
+gpsbabel -i pcx -f ${TMPDIR}/mm.pcx -o gpsutil -F ${TMPDIR}/pcx.gps
+compare ${REFERENCE}/gu.wpt ${TMPDIR}/pcx.gps
+gpsbabel -t -i gpx -f ${REFERENCE}/track/tracks.gpx -o pcx -F ${TMPDIR}/pcx.trk
+gpsbabel -t -i pcx -f ${REFERENCE}/track/pcx.trk -o pcx -F ${TMPDIR}/pcx2.trk
+compare ${TMPDIR}/pcx.trk ${TMPDIR}/pcx2.trk
+# GPSUtil strain - hand crafted, but based on problem report.
+gpsbabel -i pcx -f ${REFERENCE}/gpsutil-1.pcx -o pcx -F ${TMPDIR}/mm-2.pcx
+compare ${TMPDIR}/mm-2.pcx ${TMPDIR}/mm.pcx
--- /dev/null
+#
+# PocketFMS breadcrumb files
+#
+gpsbabel -i pocketfms_bc -f ${REFERENCE}/pocketfms_bc -o gpx,elevprec=6 -F ${TMPDIR}/pocketfms_bc.gpx
+compare ${REFERENCE}/pocketfms_bc.gpx ${TMPDIR}/pocketfms_bc.gpx
+gpsbabel -i gpx -f ${REFERENCE}/pocketfms_bc.gpx -o pocketfms_bc -F ${TMPDIR}/pocketfms_bc
+bincompare ${REFERENCE}/pocketfms_bc.babel ${TMPDIR}/pocketfms_bc
+
+#
+# PocketFMS flightplan files (.xml)
+#
+gpsbabel -i pocketfms_fp -f ${REFERENCE}/pocketfms_fp.xml -o gpx -F ${TMPDIR}/pocketfms_fp.gpx
+compare ${REFERENCE}/pocketfms_fp.gpx ${TMPDIR}/pocketfms_fp.gpx
+
+#
+# PocketFMS waypoints file (.txt)
+#
+gpsbabel -i gpx -f ${REFERENCE}/pocketfms_fp.gpx -o pocketfms_wp -F ${TMPDIR}/pocketfms_wp.txt
+compare ${REFERENCE}/pocketfms_wp.txt ${TMPDIR}/pocketfms_wp.txt
+gpsbabel -i pocketfms_wp -f ${REFERENCE}/pocketfms_wp.txt -o gpx -F ${TMPDIR}/pocketfms_wp.gpx
+compare ${REFERENCE}/pocketfms_wp.gpx ${TMPDIR}/pocketfms_wp.gpx
+
--- /dev/null
+#
+# Skyforce ascii files
+#
+gpsbabel -i skyforce -f ${REFERENCE}/skyforce_wpt.txt -o gpx -F ${TMPDIR}/skyforce_wpt.gpx
+compare ${REFERENCE}/skyforce_wpt.gpx ${TMPDIR}/skyforce_wpt.gpx
+gpsbabel -i skyforce -f ${REFERENCE}/route/skyforce_rte.txt -o gpx -F ${TMPDIR}/skyforce_rte.gpx
+compare ${REFERENCE}/route/skyforce_rte.gpx ${TMPDIR}/skyforce_rte.gpx
+gpsbabel -i skyforce -f ${REFERENCE}/track/skyforce_trk.txt -o gpx -F ${TMPDIR}/skyforce_trk.gpx
+compare ${REFERENCE}/track/skyforce_trk.gpx ${TMPDIR}/skyforce_trk.gpx
+
+gpsbabel -i skyforce \
+ -f ${REFERENCE}/skyforce_wpt.txt \
+ -f ${REFERENCE}/route/skyforce_rte.txt \
+ -f ${REFERENCE}/track/skyforce_trk.txt -o gpx -F ${TMPDIR}/skyforce.gpx
+compare ${REFERENCE}/skyforce.gpx ${TMPDIR}/skyforce.gpx
+
--- /dev/null
+
+#
+# Suunto SDF
+#
+rm -f ${TMPDIR}/stmsdf*
+gpsbabel -i garmin_txt -f ${REFERENCE}/garmin_txt.txt -t -o stmsdf -F ${TMPDIR}/stmsdf-track.sdf -r -o stmsdf,index=2 -F ${TMPDIR}/stmsdf-route.sdf
+compare ${REFERENCE}/track/stmsdf-track.sdf ${TMPDIR}/stmsdf-track.sdf
+compare ${REFERENCE}/route/stmsdf-route.sdf ${TMPDIR}/stmsdf-route.sdf
+gpsbabel -i stmsdf -f ${TMPDIR}/stmsdf-track.sdf -f ${TMPDIR}/stmsdf-route.sdf -o garmin_txt,prec=2 -F ${TMPDIR}/stmsdf.txt
+compare ${REFERENCE}/stmsdf.txt ${TMPDIR}/stmsdf.txt
+
--- /dev/null
+
+#
+# STMwpp "Suunto Trek Manager" WaypointPlus format tests
+#
+rm -f ${TMPDIR}/stmwpp-*
+gpsbabel -i stmwpp -f ${REFERENCE}/track/stmwpp-track.txt -o gpx -F ${TMPDIR}/stmwpp-track.gpx
+compare ${REFERENCE}/track/stmwpp-track.gpx ${TMPDIR}/stmwpp-track.gpx
+gpsbabel -i stmwpp -f ${REFERENCE}/route/stmwpp-route.txt -o gpx -F ${TMPDIR}/stmwpp-route.gpx
+compare ${REFERENCE}/route/stmwpp-route.gpx ${TMPDIR}/stmwpp-route.gpx
+gpsbabel -i stmwpp -f ${REFERENCE}/route/stmwpp-route.txt -o stmwpp -F ${TMPDIR}/stmwpp-route.txt
+compare ${REFERENCE}/route/stmwpp-route.txt ${TMPDIR}/stmwpp-route.txt
+
--- /dev/null
+# Tiger
+# This one is a little tacky, because it's a very lossy format.
+# so we simply test we can write it, and then read it and write it and
+# get an identical file back.
+rm -f ${TMPDIR}/tiger
+gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o tiger -F ${TMPDIR}/tiger
+gpsbabel -i tiger -f ${TMPDIR}/tiger -o tiger -F ${TMPDIR}/tiger2
+compare ${TMPDIR}/tiger ${TMPDIR}/tiger2
--- /dev/null
+
+#
+# Basic VPL test
+#
+gpsbabel -i vpl -f ${REFERENCE}/track/vpl_reference.vpl -o gpx -F ${TMPDIR}/vpl_reference.gpx
+compare ${REFERENCE}/track/vpl_reference.gpx ${TMPDIR}/vpl_reference.gpx
--- /dev/null
+#
+# Wfff.
+#
+gpsbabel -i wfff -f ${REFERENCE}/wfff.xml -o gpsutil -F ${TMPDIR}/wfff.gpu
+compare ${REFERENCE}/wfff.gpu ${TMPDIR}/wfff.gpu
+
--- /dev/null
+
+gpsbabel -i yahoo -f ${REFERENCE}/yahoo.xml -o unicsv -F ${TMPDIR}/yahoo.csv
+compare ${REFERENCE}/yahoo.csv ${TMPDIR}/yahoo.csv
+
+++ /dev/null
-#
-# G7ToWin (read only) test
-#
-gpsbabel -i g7towin -f ${REFERENCE}/expertgps.g7t -o garmin_txt,utc=0 -F ${TMPDIR}/expertgps-g7t.txt
-compare ${REFERENCE}/expertgps-g7t.txt ${TMPDIR}/expertgps-g7t.txt
# with \r\n line endings
gpsbabel -i nmea -f ${REFERENCE}/track/nmea_utf16_dos -o gpx -F ${TMPDIR}/nmea_utf16_dos.gpx
compare ${REFERENCE}/track/nmea.gpx ${TMPDIR}/nmea_utf16_dos.gpx
+# TODO(robertl): Check with tsteven4 if we can find another
+# appropriate test withot PCX
# Assumes pcx reader is still using gbgetstr.
# These are handcrafted input files, they may not be legal pcx files.
# with a unicode character from the supplemental plane encoded in utf16le.
-gpsbabel -i pcx -f ${REFERENCE}/testsupplementalplane.pcx -o unicsv -F ${TMPDIR}/testsupplementalplane.csv
-compare ${REFERENCE}/testsupplementalplane.csv ${TMPDIR}/testsupplementalplane.csv
+## gpsbabel -i pcx -f ${REFERENCE}/testsupplementalplane.pcx -o unicsv -F ${TMPDIR}/testsupplementalplane.csv
+## compare ${REFERENCE}/testsupplementalplane.csv ${TMPDIR}/testsupplementalplane.csv
+++ /dev/null
-# GoPal
-# GoPal is a bit tricky, because it's a lossy format regarding the first field (timetick).
-# so we first read a reference gopal file, and then write it out as gopal trk file, now with a computed timestamp.
-# Doing so results in more useful timestamps.
-# Next we convert this tst file to gpx to test the writing path, but gpx does not save speed, so do it twice...
-GoPalName=track20080703_173036.trk
-rm -f ${TMPDIR}/${GoPalName}.*
-#step 1: reference file
-gpsbabel -i gopal -f ${REFERENCE}/track20080703_173036.trk -o gopal -F ${TMPDIR}/${GoPalName}.tst
-#step2: gpx without speed information
-gpsbabel -i gopal -f ${TMPDIR}/${GoPalName}.tst -o gpx -F ${TMPDIR}/${GoPalName}.im
-gpsbabel -i gpx -f ${TMPDIR}/${GoPalName}.im -o gopal -F ${TMPDIR}/${GoPalName}.tst2
-#step 3: do it again to have 2 identical gopal files:
-gpsbabel -i gopal -f ${TMPDIR}/${GoPalName}.tst -o gpx -F ${TMPDIR}/${GoPalName}.im2
-gpsbabel -i gpx -f ${TMPDIR}/${GoPalName}.im2 -o gopal -F ${TMPDIR}/${GoPalName}.tst3
-compare ${TMPDIR}/${GoPalName}.tst2 ${TMPDIR}/${GoPalName}.tst3
-
-# Gopal with 11 fields is slightly more sane.
-gpsbabel -i gopal -f ${REFERENCE}/gopal-11.trk -o gpx -F ${TMPDIR}/gopal-11-gpx.gpx
-compare ${REFERENCE}/gopal-11-gpx.gpx ${TMPDIR}/gopal-11-gpx.gpx
-
+++ /dev/null
-
-# GPSman
-rm -f ${TMPDIR}/gm.gm ${TMPDIR}/gm.gm+
-gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o gpsman -F ${TMPDIR}/gm.gm -o gpsutil -F ${TMPDIR}/gu.wpt
-gpsbabel -i gpsman -f ${TMPDIR}/gm.gm -o gpsutil -F ${TMPDIR}/gm.gm+
-compare ${TMPDIR}/gm.gm+ ${TMPDIR}/gu.wpt
+++ /dev/null
-# GPSUtil
-rm -f ${TMPDIR}/gu.wpt ${TMPDIR}/1.gpx ${TMPDIR}/2.gpx
-gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o gpsutil -F ${TMPDIR}/gu.wpt
-compare ${TMPDIR}/gu.wpt ${REFERENCE}
-gpsbabel -i gpsutil -f ${TMPDIR}/gu.wpt -o gpx -F ${TMPDIR}/1.gpx
-gpsbabel -i gpsutil -f ${REFERENCE}/gu.wpt -o gpx -F ${TMPDIR}/2.gpx
-compare ${TMPDIR}/1.gpx ${TMPDIR}/2.gpx
# GPX
rm -f ${TMPDIR}/gl.gpx ${TMPDIR}/gpx.wpt
-gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o gpsman -F ${TMPDIR}/gm.gm -o gpsutil -F ${TMPDIR}/gu.wpt
gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o gpx -F ${TMPDIR}/gl.gpx
-gpsbabel -i gpx -f ${TMPDIR}/gl.gpx -o gpsutil -F ${TMPDIR}/gpx.wpt
-compare ${TMPDIR}/gpx.wpt ${TMPDIR}/gu.wpt
+gpsbabel -i gpx -f ${TMPDIR}/gl.gpx -o geo -F ${TMPDIR}/gpx.wpt
+compare ${TMPDIR}/gpx.wpt ${TMPDIR}/gpx.wpt
rm -f ${TMPDIR}/gtrnctr_power.gpx
gpsbabel -i gtrnctr -f ${REFERENCE}/track/gtrnctr_power.tcx -o gpx,garminextensions=1 -F ${TMPDIR}/gtrnctr_power.gpx
-compare ${REFERENCE}/track/gtrnctr_power.gpx ${TMPDIR}/gtrnctr_power.gpx
+compare ${REFERENCE}/track/gtrnctr_power.gpx ${TMPDIR}/gtrnctr_power.gpx
rm -f ${TMPDIR}/tpx-sample.gpx
gpsbabel -i gpx -f ${REFERENCE}/track/gpx_garmin_extensions.gpx -o gpx,garminextensions -F ${TMPDIR}/tpx-sample.gpx
-compare ${REFERENCE}/track/gpx_garmin_extensions.gpx ${TMPDIR}/tpx-sample.gpx
+compare ${REFERENCE}/track/gpx_garmin_extensions.gpx ${TMPDIR}/tpx-sample.gpx
rm -f ${TMPDIR}/basecampe~gpx.gpx
gpsbabel -i gpx -f ${REFERENCE}/basecamp.gpx -o gpx -F ${TMPDIR}/basecamp~gpx.gpx
-compare ${REFERENCE}/basecamp~gpx.gpx ${TMPDIR}/basecamp~gpx.gpx
+compare ${REFERENCE}/basecamp~gpx.gpx ${TMPDIR}/basecamp~gpx.gpx
rm -f ${TMPDIR}/extensiondata.gpx
gpsbabel -i unicsv -f ${REFERENCE}/extensiondata.unicsv -x transform,trk=wpt -o gpx,garminextensions -F ${TMPDIR}/extensiondata.gpx
# Read, write GPX file with times that don't fit in time_t, subsecond.
gpsbabel -i gpx -f ${REFERENCE}/bigtime.gpx -o gpx -F ${TMPDIR}/bigtime.gpx
-compare ${REFERENCE}/bigtime.gpx ${TMPDIR}/bigtime.gpx
+compare ${REFERENCE}/bigtime.gpx ${TMPDIR}/bigtime.gpx
# test standard output
rm -f ${TMPDIR}/basecamp~gpx_so.gpx
gpsbabel -i gpx -f ${REFERENCE}/basecamp.gpx -o gpx -F - 1> ${TMPDIR}/basecamp~gpx_so.gpx
-compare ${REFERENCE}/basecamp~gpx.gpx ${TMPDIR}/basecamp~gpx_so.gpx
+compare ${REFERENCE}/basecamp~gpx.gpx ${TMPDIR}/basecamp~gpx_so.gpx
# test standard input
rm -f ${TMPDIR}/basecamp~gpx_si.gpx
gpsbabel -i gpx -f - -o gpx -F ${TMPDIR}/basecamp~gpx_si.gpx 0< ${REFERENCE}/basecamp.gpx
-compare ${REFERENCE}/basecamp~gpx.gpx ${TMPDIR}/basecamp~gpx_si.gpx
+compare ${REFERENCE}/basecamp~gpx.gpx ${TMPDIR}/basecamp~gpx_si.gpx
# test unknown tags
rm -f ${TMPDIR}/unknowntag.gpx
+++ /dev/null
-#
-# Jogmap XML tests
-#
-rm -f ${TMPDIR}/jogmap.*
-gpsbabel -i jogmap -f ${REFERENCE}/track/jogmap.xml -o gpx -F ${TMPDIR}/jogmap.gpx
-compare ${REFERENCE}/track/jogmap-gpx.gpx ${TMPDIR}/jogmap.gpx
-
+++ /dev/null
-#
-# Jelbert GeoTagger JTR data files
-#
-gpsbabel -i jtr -f ${REFERENCE}/track/expertgps.jtr -o gpx -F ${TMPDIR}/expertgps~jtr.gpx -o jtr -F ${TMPDIR}/expertgps~jtr.jtr
-compare ${REFERENCE}/track/expertgps~jtr.gpx ${TMPDIR}/expertgps~jtr.gpx
-compare ${REFERENCE}/track/expertgps.jtr ${TMPDIR}/expertgps~jtr.jtr
-
+++ /dev/null
-
-#
-# Magellan Explorist geocaching format (write-only).
-#
-gpsbabel -i gpx -f ${REFERENCE}/gc/GC7FA4.gpx -f ${REFERENCE}/gc/GCGCA8.gpx -o maggeo -F ${TMPDIR}/maggeo.gs
-compare ${REFERENCE}/gc/maggeo.gs ${TMPDIR}/maggeo.gs
-
-gpsbabel -i maggeo -f ${REFERENCE}/gc/maggeo.gs -o maggeo -F ${TMPDIR}/maggeo2.gs
-compare ${REFERENCE}/gc/maggeo.gs ${TMPDIR}/maggeo2.gs
+++ /dev/null
-# Magellan Mapsend
-rm -f ${TMPDIR}/mm.mapsend ${TMPDIR}/mm.gps
-gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o mapsend -F ${TMPDIR}/mm.mapsend
-gpsbabel -i mapsend -f ${TMPDIR}/mm.mapsend -o gpsutil -F ${TMPDIR}/mm.gps
-compare ${TMPDIR}/mm.gps ${REFERENCE}/gu.wpt
-
-#
-# MAPSEND waypoint / route format
-#
-rm -f ${TMPDIR}/route.mapsend
-gpsbabel -r -i mapsend -f ${REFERENCE}/route/route.mapsend -o mapsend \
- -F ${TMPDIR}/route.mapsend
-bincompare ${TMPDIR}/route.mapsend ${REFERENCE}/route/route.mapsend
-
-#
-# MAPSEND track format
-#
-rm -f ${TMPDIR}/mapsend.trk
-gpsbabel -t -i mapsend -f ${REFERENCE}/track/mapsend.trk -o mapsend,trkver=3 \
- -F ${TMPDIR}/mapsend.trk
-compare ${TMPDIR}/mapsend.trk ${REFERENCE}/track/
-
+++ /dev/null
-#
-# mtk_locus logger tests
-#
-FORMAT=mtk_locus
-
-rm -f ${TMPDIR}/$FORMAT.*
-
-gpsbabel -i $FORMAT -f ${REFERENCE}/$FORMAT.nmea -o gpx -F ${TMPDIR}/$FORMAT.gpx >/dev/null
-compare ${REFERENCE}/$FORMAT.gpx ${TMPDIR}/$FORMAT.gpx
+++ /dev/null
-
-#
-# Navigon Mobile Navigator .rte tests
-#
-rm -f ${TMPDIR}/nmn4-sample*
-gpsbabel -i nmn4 -f ${REFERENCE}/route/nmn4-sample.rte -o gpx -F ${TMPDIR}/nmn4-sample.gpx
-compare ${REFERENCE}/route/nmn4-sample.gpx ${TMPDIR}/nmn4-sample.gpx
-gpsbabel -i gpx -f ${REFERENCE}/route/nmn4-sample.gpx -o nmn4 -F ${TMPDIR}/nmn4-sample-out.rte
-compare ${REFERENCE}/route/nmn4-sample-out.rte ${TMPDIR}/nmn4-sample-out.rte
+++ /dev/null
-# PCX (Garmin mapsource import) file format
-rm -f ${TMPDIR}/mm.pcx ${TMPDIR}/pcx.gps
-gpsbabel -i gpx -f ${REFERENCE}/geocaching.gpx -o pcx -F ${TMPDIR}/mm.pcx
-gpsbabel -i pcx -f ${TMPDIR}/mm.pcx -o gpsutil -F ${TMPDIR}/pcx.gps
-compare ${REFERENCE}/gu.wpt ${TMPDIR}/pcx.gps
-gpsbabel -t -i gpx -f ${REFERENCE}/track/tracks.gpx -o pcx -F ${TMPDIR}/pcx.trk
-gpsbabel -t -i pcx -f ${REFERENCE}/track/pcx.trk -o pcx -F ${TMPDIR}/pcx2.trk
-compare ${TMPDIR}/pcx.trk ${TMPDIR}/pcx2.trk
-# GPSUtil strain - hand crafted, but based on problem report.
-gpsbabel -i pcx -f ${REFERENCE}/gpsutil-1.pcx -o pcx -F ${TMPDIR}/mm-2.pcx
-compare ${TMPDIR}/mm-2.pcx ${TMPDIR}/mm.pcx
+++ /dev/null
-#
-# PocketFMS breadcrumb files
-#
-gpsbabel -i pocketfms_bc -f ${REFERENCE}/pocketfms_bc -o gpx,elevprec=6 -F ${TMPDIR}/pocketfms_bc.gpx
-compare ${REFERENCE}/pocketfms_bc.gpx ${TMPDIR}/pocketfms_bc.gpx
-gpsbabel -i gpx -f ${REFERENCE}/pocketfms_bc.gpx -o pocketfms_bc -F ${TMPDIR}/pocketfms_bc
-bincompare ${REFERENCE}/pocketfms_bc.babel ${TMPDIR}/pocketfms_bc
-
-#
-# PocketFMS flightplan files (.xml)
-#
-gpsbabel -i pocketfms_fp -f ${REFERENCE}/pocketfms_fp.xml -o gpx -F ${TMPDIR}/pocketfms_fp.gpx
-compare ${REFERENCE}/pocketfms_fp.gpx ${TMPDIR}/pocketfms_fp.gpx
-
-#
-# PocketFMS waypoints file (.txt)
-#
-gpsbabel -i gpx -f ${REFERENCE}/pocketfms_fp.gpx -o pocketfms_wp -F ${TMPDIR}/pocketfms_wp.txt
-compare ${REFERENCE}/pocketfms_wp.txt ${TMPDIR}/pocketfms_wp.txt
-gpsbabel -i pocketfms_wp -f ${REFERENCE}/pocketfms_wp.txt -o gpx -F ${TMPDIR}/pocketfms_wp.gpx
-compare ${REFERENCE}/pocketfms_wp.gpx ${TMPDIR}/pocketfms_wp.gpx
-
+++ /dev/null
-#
-# Skyforce ascii files
-#
-gpsbabel -i skyforce -f ${REFERENCE}/skyforce_wpt.txt -o gpx -F ${TMPDIR}/skyforce_wpt.gpx
-compare ${REFERENCE}/skyforce_wpt.gpx ${TMPDIR}/skyforce_wpt.gpx
-gpsbabel -i skyforce -f ${REFERENCE}/route/skyforce_rte.txt -o gpx -F ${TMPDIR}/skyforce_rte.gpx
-compare ${REFERENCE}/route/skyforce_rte.gpx ${TMPDIR}/skyforce_rte.gpx
-gpsbabel -i skyforce -f ${REFERENCE}/track/skyforce_trk.txt -o gpx -F ${TMPDIR}/skyforce_trk.gpx
-compare ${REFERENCE}/track/skyforce_trk.gpx ${TMPDIR}/skyforce_trk.gpx
-
-gpsbabel -i skyforce \
- -f ${REFERENCE}/skyforce_wpt.txt \
- -f ${REFERENCE}/route/skyforce_rte.txt \
- -f ${REFERENCE}/track/skyforce_trk.txt -o gpx -F ${TMPDIR}/skyforce.gpx
-compare ${REFERENCE}/skyforce.gpx ${TMPDIR}/skyforce.gpx
-
+++ /dev/null
-
-#
-# Suunto SDF
-#
-rm -f ${TMPDIR}/stmsdf*
-gpsbabel -i garmin_txt -f ${REFERENCE}/garmin_txt.txt -t -o stmsdf -F ${TMPDIR}/stmsdf-track.sdf -r -o stmsdf,index=2 -F ${TMPDIR}/stmsdf-route.sdf
-compare ${REFERENCE}/track/stmsdf-track.sdf ${TMPDIR}/stmsdf-track.sdf
-compare ${REFERENCE}/route/stmsdf-route.sdf ${TMPDIR}/stmsdf-route.sdf
-gpsbabel -i stmsdf -f ${TMPDIR}/stmsdf-track.sdf -f ${TMPDIR}/stmsdf-route.sdf -o garmin_txt,prec=2 -F ${TMPDIR}/stmsdf.txt
-compare ${REFERENCE}/stmsdf.txt ${TMPDIR}/stmsdf.txt
-
+++ /dev/null
-
-#
-# STMwpp "Suunto Trek Manager" WaypointPlus format tests
-#
-rm -f ${TMPDIR}/stmwpp-*
-gpsbabel -i stmwpp -f ${REFERENCE}/track/stmwpp-track.txt -o gpx -F ${TMPDIR}/stmwpp-track.gpx
-compare ${REFERENCE}/track/stmwpp-track.gpx ${TMPDIR}/stmwpp-track.gpx
-gpsbabel -i stmwpp -f ${REFERENCE}/route/stmwpp-route.txt -o gpx -F ${TMPDIR}/stmwpp-route.gpx
-compare ${REFERENCE}/route/stmwpp-route.gpx ${TMPDIR}/stmwpp-route.gpx
-gpsbabel -i stmwpp -f ${REFERENCE}/route/stmwpp-route.txt -o stmwpp -F ${TMPDIR}/stmwpp-route.txt
-compare ${REFERENCE}/route/stmwpp-route.txt ${TMPDIR}/stmwpp-route.txt
-
+++ /dev/null
-# Tiger
-# This one is a little tacky, because it's a very lossy format.
-# so we simply test we can write it, and then read it and write it and
-# get an identical file back.
-rm -f ${TMPDIR}/tiger
-gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o tiger -F ${TMPDIR}/tiger
-gpsbabel -i tiger -f ${TMPDIR}/tiger -o tiger -F ${TMPDIR}/tiger2
-compare ${TMPDIR}/tiger ${TMPDIR}/tiger2
gpsbabel -i geo -f ${REFERENCE}/gl.loc -o tomtom -F ${TMPDIR}/ov2.out
compare ${REFERENCE}/ov2-geo-out.ref ${TMPDIR}/ov2.out
-rm -f ${TMPDIR}/ov2.out
-gpsbabel -i tomtom -f ${REFERENCE}/ov2-geo-out.ref -o gpsutil -F ${TMPDIR}/ov2.out
-compare ${REFERENCE}/ov2-in.ref ${TMPDIR}/ov2.out
-
# round trip test including CP-1252 conversion
rm -f ${TMPDIR}/tomtom.gpx
gpsbabel -i tomtom -f ${REFERENCE}/tomtom.ov2 -o gpx -F ${TMPDIR}/tomtom.gpx
+++ /dev/null
-# VidaOne track logs
-gpsbabel -i vidaone -f ${REFERENCE}/track/vidaone.gpb -t -o unicsv -F ${TMPDIR}/vidaone.csv
-compare ${REFERENCE}/track/vidaone.csv ${TMPDIR}/vidaone.csv
-
+++ /dev/null
-#
-# Vito Navigator II .smt tests
-#
-rm -f ${TMPDIR}/vitosmt*
-gpsbabel -i vitosmt -f ${REFERENCE}/vitosmt.smt -o gpx -F ${TMPDIR}/vitosmt.gpx
-compare ${REFERENCE}/vitosmt.gpx ${TMPDIR}/vitosmt.gpx
-gpsbabel -t -i vitosmt -f ${REFERENCE}/vitosmt.smt -o gpx -F ${TMPDIR}/vitosmt_t.gpx
-compare ${REFERENCE}/track/vitosmt_t.gpx ${TMPDIR}/vitosmt_t.gpx
-
+++ /dev/null
-#
-# VITO SmartMap .vtt track file 'vitovtt' test
-#
-rm -f ${TMPDIR}/vitovtt-*
-gpsbabel -i vitovtt -f ${REFERENCE}/track/vitovtt-sample.vtt -o gpx -F ${TMPDIR}/vitovtt-sample.gpx
-compare ${REFERENCE}/track/vitovtt-sample.gpx ${TMPDIR}/vitovtt-sample.gpx
+++ /dev/null
-
-#
-# Basic VPL test
-#
-gpsbabel -i vpl -f ${REFERENCE}/track/vpl_reference.vpl -o gpx -F ${TMPDIR}/vpl_reference.gpx
-compare ${REFERENCE}/track/vpl_reference.gpx ${TMPDIR}/vpl_reference.gpx
+++ /dev/null
-#
-# Wfff.
-#
-gpsbabel -i wfff -f ${REFERENCE}/wfff.xml -o gpsutil -F ${TMPDIR}/wfff.gpu
-compare ${REFERENCE}/wfff.gpu ${TMPDIR}/wfff.gpu
-
+++ /dev/null
-
-gpsbabel -i yahoo -f ${REFERENCE}/yahoo.xml -o unicsv -F ${TMPDIR}/yahoo.csv
-compare ${REFERENCE}/yahoo.csv ${TMPDIR}/yahoo.csv
-
+++ /dev/null
-/*
- Access to U.S. Census Bureau "tiger" format.
-
- Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include "defs.h"
-#include "cet_util.h"
-#include "csv_util.h"
-#include <cmath>
-#include <cstdio>
-#include <cstdlib>
-
-static gbfile* file_in, *file_out;
-static short_handle mkshort_handle;
-static short_handle mkshort_whandle;
-
-#define MYNAME "GPSUTIL"
-
-static double maxlat, maxlon, minlat, minlon;
-static int rec_cnt;
-static char* nolabels = nullptr;
-static char* genurl = nullptr;
-static char* suppresswhite = nullptr;
-static char* iconismarker = nullptr;
-static char* snlen = nullptr;
-
-static char* margin = nullptr;
-static char* xpixels = nullptr;
-static char* ypixels = nullptr;
-static char* oldthresh = nullptr;
-static char* oldmarker = nullptr;
-static char* newmarker = nullptr;
-static char* unfoundmarker = nullptr;
-
-static int short_length;
-static double thresh_days;
-
-/*
- * The code bracketed by CLICKMAP is to generate clickable image maps
- * for a web browser. It's functional, but is missing the math to do
- * the projection transformations. Some trig geek can finish that.
- */
-#if CLICKMAP
-static gbfile* linkf;
-static char* clickmap = NULL;
-#endif
-
-
-static
-QVector<arglist_t> tiger_args = {
- {
- "nolabels", &nolabels, "Suppress labels on generated pins",
- nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
- },
- {
- "genurl", &genurl, "Generate file with lat/lon for centering map",
- nullptr, ARGTYPE_OUTFILE, ARG_NOMINMAX, nullptr
- },
- {
- "margin", &margin, "Margin for map. Degrees or percentage",
- "15%", ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr
- },
- {
- "snlen", &snlen, "Max shortname length when used with -s",
- "10", ARGTYPE_INT, "1", nullptr, nullptr
- },
- {
- "oldthresh", &oldthresh,
- "Days after which points are considered old",
- "14", ARGTYPE_INT, ARG_NOMINMAX, nullptr
- },
- {
- "oldmarker", &oldmarker, "Marker type for old points",
- "redpin", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "newmarker", &newmarker, "Marker type for new points",
- "greenpin", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "suppresswhite", &suppresswhite,
- "Suppress whitespace in generated shortnames",
- nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
- },
- {
- "unfoundmarker", &unfoundmarker, "Marker type for unfound points",
- "bluepin", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "xpixels", &xpixels, "Width in pixels of map",
- "768", ARGTYPE_INT, ARG_NOMINMAX, nullptr
- },
- {
- "ypixels", &ypixels, "Height in pixels of map",
- "768", ARGTYPE_INT, ARG_NOMINMAX, nullptr
- },
- {
- "iconismarker", &iconismarker,
- "The icon description is already the marker", nullptr,
- ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
- },
-#if CLICKMAP
- {
- "clickmap", &clickmap, "Generate Clickable map web page",
- NULL, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
- },
-#endif
-};
-
-
-static void
-rd_init(const QString& fname)
-{
- file_in = gbfopen(fname, "rb", MYNAME);
- mkshort_handle = mkshort_new_handle();
-}
-
-static void
-rd_deinit()
-{
- gbfclose(file_in);
- mkshort_del_handle(&mkshort_handle);
-}
-
-static void
-wr_init(const QString& fname)
-{
- file_out = gbfopen(fname, "w", MYNAME);
- thresh_days = strtod(oldthresh, nullptr);
-}
-
-static void
-wr_deinit()
-{
- gbfclose(file_out);
-}
-
-static void
-data_read()
-{
- double lat,lon;
- char desc[101];
- char icon[101];
- char* ibuf;
- int line = 0;
-
- while ((ibuf = gbfgetstr(file_in))) {
- if ((line++ == 0) && file_in->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
- if (sscanf(ibuf, "%lf,%lf:%100[^:]:%100[^\n]",
- &lon, &lat, icon, desc)) {
- auto* wpt_tmp = new Waypoint;
-
- wpt_tmp->longitude = lon;
- wpt_tmp->latitude = lat;
- wpt_tmp->description = desc;
- wpt_tmp->shortname = mkshort(mkshort_handle, QString(desc));
-
- waypt_add(wpt_tmp);
- }
- }
-}
-
-static void
-tiger_disp(const Waypoint* wpt)
-{
- QString pin;
- double lat = wpt->latitude;
- double lon = wpt->longitude;
-
- if (iconismarker) {
- pin = wpt->icon_descr;
- } else if (wpt->icon_descr.contains("-unfound")) {
- pin = unfoundmarker;
- } else if (wpt->GetCreationTime() > current_time().addSecs(-3600 * 24 * thresh_days)) {
- pin = newmarker;
- } else {
- pin = oldmarker;
- }
-
- if (genurl) {
- if (lat > maxlat) {
- maxlat = lat;
- }
- if (lon > maxlon) {
- maxlon = lon;
- }
- if (lat < minlat) {
- minlat = lat;
- }
- if (lon < minlon) {
- minlon = lon;
- }
- }
-
- gbfprintf(file_out, "%f,%f:%s", lon, lat, CSTR(pin));
- if (!nolabels) {
- QString temp;
- QString desc = csv_stringclean(wpt->description, ":");
- if (global_opts.synthesize_shortnames) {
- temp = desc;
- desc = mkshort(mkshort_whandle, desc);
- }
- gbfprintf(file_out, ":%s", CSTR(desc));
- if (temp != nullptr) {
- desc = temp;
- }
- }
- gbfprintf(file_out, "\n");
-}
-
-#if CLICKMAP
-static void
-map_plot(const Waypoint* wpt)
-{
- static int x,y;
-
- /* Replace with real math. */
- x+=10;
- y+=10;
-
- gbfprintf(linkf, "<area shape=\"circle\" coords=\"%d,%d,7\" href=\"%s\" alt=\"%s\"\n", x, y, wpt->url, wpt->description);
-}
-#endif /* CLICKMAP */
-
-static double
-dscale(double distance)
-{
- /*
- * If we have any specified margin options factor those in now.
- * A additional little boundary is helpful because Tiger always
- * puts the pin above the actual coord and if we don't pad the
- * top will be clipped. It also makes the maps more useful to
- * have a little bit of context around the pins on the border.
- */
-
- if (strchr(margin, '%')) {
- return distance + strtod(margin, nullptr) / 100.0 * distance;
- } else {
- return strtod(margin, nullptr) + distance;
- }
-}
-
-static void
-data_write()
-{
- maxlat = -9999.0;
- maxlon = -9999.0;
- minlat = 9999.0;
- minlon = 9999.0;
- rec_cnt = 0;
-
- short_length = atoi(snlen);
- mkshort_whandle = mkshort_new_handle();
-
- if (suppresswhite) {
- setshort_whitespace_ok(mkshort_whandle, 0);
- }
-
- setshort_length(mkshort_whandle, short_length);
-
- gbfprintf(file_out, "#tms-marker\n");
- waypt_disp_all(tiger_disp);
-
- if (genurl) {
- gbfile* urlf = gbfopen(genurl, "w", MYNAME);
- double latsz = fabs(maxlat - minlat);
- double lonsz = fabs(maxlon - minlon);
-
- /*
- * Center the map along X and Y axis the midpoint of
- * our min and max coords each way.
- */
- gbfprintf(urlf, "lat=%f&lon=%f&ht=%f&wid=%f",
- minlat + (latsz/2.0),
- minlon + (lonsz/2.0),
- dscale(latsz),
- dscale(lonsz));
-
- gbfprintf(urlf, "&iwd=%s&iht=%s", xpixels, ypixels);
- gbfclose(urlf);
-#if CLICKMAP
- if (clickmap) {
- linkf = gbfopen(clickmap, "w", MYNAME);
- gbfprintf(linkf, "<map name=\"map\">\n");
- waypt_disp_all(map_plot);
- gbfprintf(linkf, "</map>\n");
- gbfclose(linkf);
- linkf = NULL;
- }
-#endif
- }
-
- mkshort_del_handle(&mkshort_whandle);
-}
-
-
-ff_vecs_t tiger_vecs = {
- ff_type_file,
- FF_CAP_RW_WPT,
- rd_init,
- wr_init,
- rd_deinit,
- wr_deinit,
- data_read,
- data_write,
- nullptr,
- &tiger_args,
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
remove_word() {
-# git add $2
-set -x
# This uses a GNU extension ? for zero or more, letting us match with last
# entry in a line which has no following whitespace
$SED -i "s/$1\s*//g" $2
+ git add $2
}
remove_line_containing() {
-# git add $2
$SED -i "/$1/d" $2
+ git add $2
}
# For things it's easier to just edit away.:1
remove_manually() {
grep $1 $2 && $EDITOR +/$1 $2
- # git add $2
+ git add $2
}
remove_word $1.cc CMakelists.txt
#include "defs.h"
#include "dg-100.h"
-#include "format.h"
#include "energympro.h"
+#include "format.h"
#include "garmin_fit.h"
#include "geojson.h"
#include "ggv_bin.h"
#include "subrip.h"
#include "unicsv.h"
#include "xcsv.h"
-#include "yahoo.h"
-
extern ff_vecs_t geo_vecs;
extern ff_vecs_t mag_svecs;
extern ff_vecs_t magX_fvecs;
extern ff_vecs_t garmin_vecs;
extern ff_vecs_t gdb_vecs;
-extern ff_vecs_t mapsend_vecs;
extern ff_vecs_t ozi_vecs;
-extern ff_vecs_t pcx_vecs;
#if MAXIMAL_ENABLED
-extern ff_vecs_t gpsutil_vecs;
extern ff_vecs_t holux_vecs;
extern ff_vecs_t tpg_vecs;
extern ff_vecs_t tpo2_vecs;
extern ff_vecs_t tpo3_vecs;
-extern ff_vecs_t tiger_vecs;
extern ff_vecs_t easygps_vecs;
extern ff_vecs_t saroute_vecs;
extern ff_vecs_t navicache_vecs;
#endif // MAXIMAL_ENABLED
extern ff_vecs_t wbt_svecs;
#if MAXIMAL_ENABLED
-extern ff_vecs_t vpl_vecs;
extern ff_vecs_t wbt_fvecs;
//extern ff_vecs_t wbt_fvecs;
extern ff_vecs_t hiketech_vecs;
extern ff_vecs_t glogbook_vecs;
extern ff_vecs_t vcf_vecs;
extern ff_vecs_t google_dir_vecs;
-extern ff_vecs_t maggeo_vecs;
extern ff_vecs_t tomtom_vecs;
extern ff_vecs_t tef_xml_vecs;
-extern ff_vecs_t vitosmt_vecs;
-extern ff_vecs_t wfff_xml_vecs;
extern ff_vecs_t bcr_vecs;
extern ff_vecs_t ignr_vecs;
-#if CSVFMTS_ENABLED
-extern ff_vecs_t stmsdf_vecs;
-#endif // CSVFMTS_ENABLED
-#if CSVFMTS_ENABLED
-extern ff_vecs_t stmwpp_vecs;
-#endif // CSVFMTS_ENABLED
-extern ff_vecs_t nmn4_vecs;
-#if CSVFMTS_ENABLED
-extern ff_vecs_t compegps_vecs;
-#endif // CSVFMTS_ENABLED
-// extern ff_vecs_t yahoo_vecs;
extern ff_vecs_t gtm_vecs;
extern ff_vecs_t gpssim_vecs;
#if CSVFMTS_ENABLED
extern ff_vecs_t gtc_vecs;
extern ff_vecs_t dmtlog_vecs;
extern ff_vecs_t raymarine_vecs;
-extern ff_vecs_t vitovtt_vecs;
extern ff_vecs_t ggv_log_vecs;
-#if CSVFMTS_ENABLED
-extern ff_vecs_t g7towin_vecs;
-#endif // CSVFMTS_ENABLED
extern ff_vecs_t garmin_gpi_vecs;
extern ff_vecs_t lmx_vecs;
extern ff_vecs_t xol_vecs;
extern ff_vecs_t destinator_itn_vecs;
extern ff_vecs_t destinator_trl_vecs;
extern ff_vecs_t exif_vecs;
-extern ff_vecs_t vidaone_vecs;
extern ff_vecs_t igo8_vecs;
-extern ff_vecs_t gopal_vecs;
extern ff_vecs_t humminbird_vecs;
extern ff_vecs_t humminbird_ht_vecs;
extern ff_vecs_t mapasia_tr7_vecs;
extern ff_vecs_t navitel_trk_vecs;
extern ff_vecs_t ggv_ovl_vecs;
#if CSVFMTS_ENABLED
-extern ff_vecs_t jtr_vecs;
#endif // CSVFMTS_ENABLED
extern ff_vecs_t itracku_vecs;
extern ff_vecs_t itracku_fvecs;
extern ff_vecs_t sbp_vecs;
extern ff_vecs_t sbn_vecs;
extern ff_vecs_t mmo_vecs;
-extern ff_vecs_t skyforce_vecs;
-extern ff_vecs_t pocketfms_bc_vecs;
-extern ff_vecs_t pocketfms_fp_vecs;
-extern ff_vecs_t pocketfms_wp_vecs;
extern ff_vecs_t v900_vecs;
extern ff_vecs_t enigma_vecs;
extern ff_vecs_t skytraq_vecs;
extern ff_vecs_t teletype_vecs;
extern ff_vecs_t skytraq_fvecs;
extern ff_vecs_t miniHomer_vecs;
-extern ff_vecs_t jogmap_vecs;
extern ff_vecs_t wintec_tes_vecs;
extern ff_vecs_t format_garmin_xt_vecs;
extern ff_vecs_t mapbar_track_vecs;
LegacyFormat magX_ffmt {magX_fvecs};
LegacyFormat garmin_fmt {garmin_vecs};
LegacyFormat gdb_fmt {gdb_vecs};
- LegacyFormat mapsend_fmt {mapsend_vecs};
NmeaFormat nmea_fmt;
LegacyFormat ozi_fmt {ozi_vecs};
- LegacyFormat pcx_fmt {pcx_vecs};
KmlFormat kml_fmt;
#if MAXIMAL_ENABLED
- LegacyFormat gpsutil_fmt {gpsutil_vecs};
LowranceusrFormat lowranceusr_fmt;
LegacyFormat holux_fmt {holux_vecs};
LegacyFormat tpg_fmt {tpg_vecs};
LegacyFormat tpo2_fmt {tpo2_vecs};
LegacyFormat tpo3_fmt {tpo3_vecs};
- LegacyFormat tiger_fmt {tiger_vecs};
LegacyFormat easygps_fmt {easygps_vecs};
LegacyFormat saroute_fmt {saroute_vecs};
LegacyFormat navicache_fmt {navicache_vecs};
#endif // MAXIMAL_ENABLED
LegacyFormat wbt_sfmt {wbt_svecs};
#if MAXIMAL_ENABLED
- LegacyFormat vpl_fmt {vpl_vecs};
LegacyFormat wbt_ffmt {wbt_fvecs};
//LegacyFormat wbt_ffmt {wbt_fvecs};
LegacyFormat hiketech_fmt {hiketech_vecs};
LegacyFormat glogbook_fmt {glogbook_vecs};
LegacyFormat vcf_fmt {vcf_vecs};
LegacyFormat google_dir_fmt {google_dir_vecs};
- LegacyFormat maggeo_fmt {maggeo_vecs};
LegacyFormat tomtom_fmt {tomtom_vecs};
LegacyFormat tef_xml_fmt {tef_xml_vecs};
- LegacyFormat vitosmt_fmt {vitosmt_vecs};
- LegacyFormat wfff_xml_fmt {wfff_xml_vecs};
LegacyFormat bcr_fmt {bcr_vecs};
LegacyFormat ignr_fmt {ignr_vecs};
-#if CSVFMTS_ENABLED
- LegacyFormat stmsdf_fmt {stmsdf_vecs};
-#endif // CSVFMTS_ENABLED
-#if CSVFMTS_ENABLED
- LegacyFormat stmwpp_fmt {stmwpp_vecs};
-#endif // CSVFMTS_ENABLED
- LegacyFormat nmn4_fmt {nmn4_vecs};
-#if CSVFMTS_ENABLED
- LegacyFormat compegps_fmt {compegps_vecs};
-#endif // CSVFMTS_ENABLED
- YahooFormat yahoo_fmt;
UnicsvFormat unicsv_fmt;
LegacyFormat gtm_fmt {gtm_vecs};
LegacyFormat gpssim_fmt {gpssim_vecs};
LegacyFormat gtc_fmt {gtc_vecs};
LegacyFormat dmtlog_fmt {dmtlog_vecs};
LegacyFormat raymarine_fmt {raymarine_vecs};
- LegacyFormat vitovtt_fmt {vitovtt_vecs};
LegacyFormat ggv_log_fmt {ggv_log_vecs};
-#if CSVFMTS_ENABLED
- LegacyFormat g7towin_fmt {g7towin_vecs};
-#endif // CSVFMTS_ENABLED
LegacyFormat garmin_gpi_fmt {garmin_gpi_vecs};
LegacyFormat lmx_fmt {lmx_vecs};
RandomFormat random_fmt;
LegacyFormat destinator_itn_fmt {destinator_itn_vecs};
LegacyFormat destinator_trl_fmt {destinator_trl_vecs};
LegacyFormat exif_fmt {exif_vecs};
- LegacyFormat vidaone_fmt {vidaone_vecs};
LegacyFormat igo8_fmt {igo8_vecs};
- LegacyFormat gopal_fmt {gopal_vecs};
LegacyFormat humminbird_fmt {humminbird_vecs};
LegacyFormat humminbird_ht_fmt {humminbird_ht_vecs};
LegacyFormat mapasia_tr7_fmt {mapasia_tr7_vecs};
LegacyFormat gnav_trl_fmt {gnav_trl_vecs};
LegacyFormat navitel_trk_fmt {navitel_trk_vecs};
LegacyFormat ggv_ovl_fmt {ggv_ovl_vecs};
-#if CSVFMTS_ENABLED
- LegacyFormat jtr_fmt {jtr_vecs};
-#endif // CSVFMTS_ENABLED
LegacyFormat itracku_fmt {itracku_vecs};
LegacyFormat itracku_ffmt {itracku_fvecs};
LegacyFormat sbp_fmt {sbp_vecs};
LegacyFormat sbn_fmt {sbn_vecs};
LegacyFormat mmo_fmt {mmo_vecs};
- LegacyFormat skyforce_fmt {skyforce_vecs};
- LegacyFormat pocketfms_bc_fmt {pocketfms_bc_vecs};
- LegacyFormat pocketfms_fp_fmt {pocketfms_fp_vecs};
- LegacyFormat pocketfms_wp_fmt {pocketfms_wp_vecs};
LegacyFormat v900_fmt {v900_vecs};
LegacyFormat enigma_fmt {enigma_vecs};
LegacyFormat skytraq_fmt {skytraq_vecs};
LegacyFormat teletype_fmt {teletype_vecs};
LegacyFormat skytraq_ffmt {skytraq_fvecs};
LegacyFormat miniHomer_fmt {miniHomer_vecs};
- LegacyFormat jogmap_fmt {jogmap_vecs};
LegacyFormat wintec_tes_fmt {wintec_tes_vecs};
SubripFormat subrip_fmt;
LegacyFormat format_garmin_xt_fmt {format_garmin_xt_vecs};
"gdb",
nullptr,
},
- {
- &mapsend_fmt,
- "mapsend",
- "Magellan Mapsend",
- nullptr,
- nullptr,
- },
{
&nmea_fmt,
"nmea",
nullptr,
nullptr,
},
- {
- &pcx_fmt,
- "pcx",
- "Garmin PCX5",
- "pcx",
- nullptr,
- },
{
&kml_fmt,
"kml",
nullptr,
},
#if MAXIMAL_ENABLED
- {
- &gpsutil_fmt,
- "gpsutil",
- "gpsutil",
- nullptr,
- nullptr,
- },
{
&lowranceusr_fmt,
"lowranceusr",
"tpo",
nullptr,
},
- {
- &tiger_fmt,
- "tiger",
- "U.S. Census Bureau Tiger Mapping Service",
- nullptr,
- nullptr,
- },
{
&easygps_fmt,
"easygps",
nullptr,
},
#if MAXIMAL_ENABLED
- {
- &vpl_fmt,
- "vpl",
- "Honda/Acura Navigation System VP Log File Format",
- nullptr,
- nullptr,
- },
{
&wbt_ffmt,
"wbt-bin",
"xml",
nullptr,
},
- {
- &maggeo_fmt,
- "maggeo",
- "Magellan Explorist Geocaching",
- "gs",
- nullptr,
- },
{
&tomtom_fmt,
"tomtom",
"xml",
nullptr,
},
- {
- &vitosmt_fmt,
- "vitosmt",
- "Vito Navigator II tracks",
- "smt",
- nullptr,
- },
- {
- &wfff_xml_fmt,
- "wfff",
- "WiFiFoFum 2.0 for PocketPC XML",
- "xml",
- nullptr,
- },
{
&bcr_fmt,
"bcr",
"rdn",
nullptr,
},
-#if CSVFMTS_ENABLED
- {
- &stmsdf_fmt,
- "stmsdf",
- "Suunto Trek Manager (STM) .sdf files",
- "sdf",
- nullptr,
- },
-#endif
-#if CSVFMTS_ENABLED
- {
- &stmwpp_fmt,
- "stmwpp",
- "Suunto Trek Manager (STM) WaypointPlus files",
- "txt",
- nullptr,
- },
-#endif // CSVFMTS_ENABLED
- {
- &nmn4_fmt,
- "nmn4",
- "Navigon Mobile Navigator .rte files",
- "rte",
- nullptr,
- },
-#if CSVFMTS_ENABLED
- {
- &compegps_fmt,
- "compegps",
- "CompeGPS data files (.wpt/.trk/.rte)",
- nullptr,
- nullptr,
- },
-#endif //CSVFMTS_ENABLED
- {
- &yahoo_fmt,
- "yahoo",
- "Yahoo Geocode API data",
- nullptr,
- nullptr,
- },
{
&unicsv_fmt,
"unicsv",
"rwf",
nullptr,
},
- {
- &vitovtt_fmt,
- "vitovtt",
- "Vito SmartMap tracks (.vtt)",
- "vtt",
- nullptr,
- },
{
&ggv_log_fmt,
"ggv_log",
"log",
nullptr,
},
-#if CSVFMTS_ENABLED
- {
- &g7towin_fmt,
- "g7towin",
- "G7ToWin data files (.g7t)",
- "g7t",
- nullptr,
- },
-#endif
{
&garmin_gpi_fmt,
"garmin_gpi",
"jpg",
nullptr,
},
- {
- &vidaone_fmt,
- "vidaone",
- "VidaOne GPS for Pocket PC (.gpb)",
- "gpb",
- nullptr,
- },
{
&igo8_fmt,
"igo8",
"trk",
nullptr,
},
- {
- &gopal_fmt,
- "gopal",
- "GoPal GPS track log (.trk)",
- "trk",
- nullptr,
- },
{
&humminbird_fmt,
"humminbird",
"ovl",
nullptr,
},
-#if CSVFMTS_ENABLED
- {
- &jtr_fmt,
- "jtr",
- "Jelbert GeoTagger data file",
- "jtr",
- nullptr,
- },
-#endif
{
&itracku_fmt,
"itracku",
"mmo",
nullptr,
},
- {
- &skyforce_fmt,
- "skyforce",
- "Skymap / KMD150 ascii files",
- nullptr,
- nullptr,
- },
- {
- &pocketfms_bc_fmt,
- "pocketfms_bc",
- "PocketFMS breadcrumbs",
- nullptr,
- nullptr,
- },
- {
- &pocketfms_fp_fmt,
- "pocketfms_fp",
- "PocketFMS flightplan (.xml)",
- "xml",
- nullptr,
- },
- {
- &pocketfms_wp_fmt,
- "pocketfms_wp",
- "PocketFMS waypoints (.txt)",
- "txt",
- nullptr,
- },
{
&v900_fmt,
"v900",
nullptr,
nullptr,
},
- {
- &jogmap_fmt,
- "jogmap",
- "Jogmap.de XML format",
- "xml",
- nullptr,
- },
{
&wintec_tes_fmt,
"wintec_tes",
+++ /dev/null
-/*
-
- Support for VidaOne GPS for Pocket PC (.gpb) files
-
- Copyright (C) 2008 Olaf Klein, o.b.klein@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-/*
- Simple layout:
-
-struct
-{
- double dLatitude
- double dLongitude
- float fReserved
-};
-*/
-
-#include "defs.h"
-#include <cmath>
-#include <cstdlib>
-
-#define MYNAME "vidaone"
-
-#define VIDAONE_VER "ver"
-
-static char* vidaone_opt_ver;
-static int vidaone_ver;
-
-static
-QVector<arglist_t> vidaone_args = {
- {
- VIDAONE_VER, &vidaone_opt_ver,
- "Version of VidaOne file to read or write (1 or 2)",
- "1", ARGTYPE_INT, "1", "2", nullptr
- },
-};
-
-static gbfile* fin, *fout;
-
-/*******************************************************************************
-* %%% global callbacks called by gpsbabel main process %%% *
-*******************************************************************************/
-
-static void
-vidaone_rd_init(const QString& fname)
-{
- vidaone_ver = atoi(vidaone_opt_ver);
- fin = gbfopen(fname, "rb", MYNAME);
-}
-
-static void
-vidaone_rd_deinit()
-{
- gbfclose(fin);
-}
-
-static void
-vidaone_read()
-{
- route_head* trk = nullptr;
-
- while (! gbfeof(fin)) {
- auto* wpt = new Waypoint;
-
- wpt->latitude = gbfgetdbl(fin);
- wpt->longitude = gbfgetdbl(fin);
- if (vidaone_ver >= 2) {
- wpt->altitude = gbfgetflt(fin);
- }
- (void) gbfgetflt(fin);
-
- /* Only one basic check of data integrity */
- if ((fabs(wpt->latitude) > 90) || (fabs(wpt->longitude) > 180)) {
- fatal(MYNAME ": Latitude and/or longitude out of range.\n");
- }
-
- if (!trk) {
- trk = new route_head;
- track_add_head(trk);
- }
-
- track_add_wpt(trk, wpt);
- }
-}
-
-static void
-vidaone_wr_init(const QString& fname)
-{
- vidaone_ver = atoi(vidaone_opt_ver);
- fout = gbfopen(fname, "wb", MYNAME);
-}
-
-static void
-vidaone_wr_deinit()
-{
- gbfclose(fout);
-}
-
-static void
-vidaone_trkpt(const Waypoint* wpt)
-{
- gbfputdbl(wpt->latitude, fout);
- gbfputdbl(wpt->longitude, fout);
- if (vidaone_ver >= 2) {
- gbfputflt(wpt->altitude, fout);
- }
- gbfputflt(0, fout);
-}
-
-static void
-vidaone_write()
-{
- track_disp_all(nullptr, nullptr, vidaone_trkpt);
-}
-
-/**************************************************************************/
-
-ff_vecs_t vidaone_vecs = {
- ff_type_file,
- {
- ff_cap_none /* waypoints */,
- (ff_cap)(ff_cap_read | ff_cap_write) /* tracks */,
- ff_cap_none /* routes */
- },
- vidaone_rd_init,
- vidaone_wr_init,
- vidaone_rd_deinit,
- vidaone_wr_deinit,
- vidaone_read,
- vidaone_write,
- nullptr,
- &vidaone_args,
- CET_CHARSET_UTF8, 1
- , NULL_POS_OPS,
- nullptr
-};
-
-/**************************************************************************/
+++ /dev/null
-/*
- Read Vito Navigator .SMT tracks
-
- Copyright (C) 2005 Etienne TASSE
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include "defs.h"
-#include "grtcirc.h"
-#include <cerrno>
-#include <cmath>
-
-#define MYNAME "vitosmt"
-
-static gbfile* infile = nullptr;
-static gbfile* ofs =nullptr;
-static long count = 0;
-
-const long vitosmt_version = 2;
-const long vitosmt_subversion = 1000;
-const size_t vitosmt_headersize = 24;
-const size_t vitosmt_datasize = 64;
-
-static unsigned char*
-ReadRecord(gbfile* f, gbsize_t size)
-{
- auto* result = (unsigned char*) xmalloc(size);
-
- gbfread(result, size, 1, f);
- return result;
-}
-
-static void
-WriteDouble(void* ptr, double d)
-{
- unsigned char result[9]="\0\0\0\0\0\0\0\0";
- le_write_double(result,d);
- memcpy(ptr, result, 8);
-}
-
-
-static void
-rd_init(const QString& fname)
-{
- infile = gbfopen_le(fname, "rb", MYNAME);
-}
-
-static void
-rd_deinit()
-{
- gbfclose(infile);
-}
-
-static void
-vitosmt_read()
-{
- route_head* rte = nullptr;
- int serial = 0;
-
- /*
- * 24 bytes header
- */
- long version = gbfgetint32(infile); /* 2 */
- long subversion = gbfgetint32(infile); /* 1000 */
- count = gbfgetint32(infile); /* n */
- long check1 = gbfgetint32(infile); /* 0 */
- long check2 = gbfgetint32(infile); /* not sure */
- (void) check2; // silence warning.
- long check3 = gbfgetint32(infile); /* n */
-
- if (version!=vitosmt_version) {
-
- fatal("%s (%d) reading file. Unsupported version %ld.%ld\n",
- MYNAME, __LINE__, version, subversion);
- }
-
- if (subversion!=vitosmt_subversion) {
- warning("%s (%d) reading file. Unsafe version %ld.%ld\n",
- MYNAME, __LINE__, version, subversion);
- }
-
- if ((count!=check3) ||
- (check1!=count-1) ||
- (check3!=count)) {
-
- fatal("%s (%d) reading file. Invalid file header\n",
- MYNAME, __LINE__);
-
- }
-
- while (count) {
- /*
- * 64 bytes of data
- */
- if (gbfeof(infile)||gbferror(infile)) {
- warning("%s (%d) reading file. Unexpected end of file %s\n",
- MYNAME, __LINE__, strerror(errno));
- break;
- }
- double latrad = gbfgetdbl(infile); /* WGS84 latitude in radians */
- double lonrad = gbfgetdbl(infile); /* WGS84 longitude in radians */
- double elev = gbfgetdbl(infile); /* elevation in meters */
- unsigned char* timestamp = ReadRecord(infile,5); /* UTC time yr/mo/dy/hr/mi */
- double seconds = gbfgetdbl(infile); /* seconds */
- double speed = gbfgetdbl(infile); /* speed in knots */
- double course = gbfgetdbl(infile); /* course in degrees */
- double pdop = gbfgetdbl(infile); /* dilution of precision */
- unsigned char gpsfix = gbfgetc(infile); /* fix type x08,x10, x20 */
- unsigned char gpsvalid = gbfgetc(infile); /* fix is valid */
- unsigned char gpssats = gbfgetc(infile); /* number of sats */
-
- auto* wpt_tmp = new Waypoint;
-
- wpt_tmp->latitude = DEG(latrad);
- wpt_tmp->longitude = DEG(lonrad);
- wpt_tmp->altitude = elev;
-
- wpt_tmp->SetCreationTime(QDateTime(
- QDate(timestamp[0] + 2000, timestamp[1], timestamp[2]),
- QTime(timestamp[3], timestamp[4]),
- Qt::UTC).addMSecs(lround(seconds*1000.0)));
-
- wpt_tmp->shortname = QString::asprintf("WP%04d", ++serial);
-
- WAYPT_SET(wpt_tmp, speed, KNOTS_TO_MPS(speed)); /* meters per second */
- WAYPT_SET(wpt_tmp, course, course);
- wpt_tmp->pdop = pdop;
-
- /*
- GPS Fix data
- */
- if (gpsvalid&0x7) {
- if (gpsfix==0) {
- wpt_tmp->fix =fix_none;
- }
- if (gpsfix&0x8) {
- wpt_tmp->fix =fix_2d;
- } else if (gpsfix&0x10) {
- wpt_tmp->fix =fix_3d;
- } else if (gpsfix&0x20) {
- wpt_tmp->fix =fix_dgps;
- } else {
- wpt_tmp->fix =fix_unknown;
- }
-
- /* <sat> */
- wpt_tmp->sat = gpssats;
- } else {
- wpt_tmp->fix =fix_unknown;
- }
-
- if (doing_wpts) { /* process as waypoints */
- waypt_add(wpt_tmp);
- } else if (doing_rtes) { /* process as route */
- if (rte == nullptr) {
- rte = new route_head;
- route_add_head(rte);
- }
- route_add_wpt(rte, wpt_tmp);
- } else { /* default track mode */
- if (rte == nullptr) {
- rte = new route_head;
- track_add_head(rte);
- }
- track_add_wpt(rte, wpt_tmp);
- }
-
- xfree(timestamp);
-
- count--;
- }
-}
-
-static void
-wr_init(const QString& fname)
-{
- warning(MYNAME " write: format is experimental and may crash Vito Navigator II.\n");
- ofs = gbfopen_le(fname, "wb", MYNAME);
-}
-
-static void
-wr_deinit()
-{
- gbfclose(ofs);
-
-}
-
-static void
-vitosmt_waypt_pr(const Waypoint* waypointp)
-{
- size_t position =0;
- double seconds =0;
-
- ++count;
- auto* workbuffer = (unsigned char*) xcalloc(vitosmt_datasize,1);
-
- WriteDouble(&workbuffer[position], RAD(waypointp->latitude));
- position += sizeof(double);
- WriteDouble(&workbuffer[position], RAD(waypointp->longitude));
- position += sizeof(double);
- if (waypointp->altitude-1 > unknown_alt) {
- WriteDouble(&workbuffer[position], waypointp->altitude);
- }
- position += sizeof(double);
- QDate date(waypointp->GetCreationTime().date());
- QTime time(waypointp->GetCreationTime().time());
- workbuffer[position++] = date.year()-100;
- workbuffer[position++] = date.month();
- workbuffer[position++] = date.day();
- workbuffer[position++] = time.hour();
- workbuffer[position++] = time.minute();
-
- WriteDouble(&workbuffer[position], seconds);
- position += sizeof(double);
-
- /* speed */
- if (waypointp->speed>0) {
- WriteDouble(&workbuffer[position], MPS_TO_MPH(waypointp->speed));
- }
- position += sizeof(double);
-
- /* course */
- if ((waypointp->course>=-360.0)&&(waypointp->course<=360.0)) {
- WriteDouble(&workbuffer[position], waypointp->course);
- }
- position += sizeof(double);
-
- /* pdop */
- if (waypointp->pdop>0) {
- WriteDouble(&workbuffer[position], waypointp->pdop);
- }
- position += sizeof(double);
-
-
- /* fix type */
- switch (waypointp->fix) {
- case fix_2d:
- workbuffer[position++] = 0x08;
- break;
- case fix_3d:
- workbuffer[position++] = 0x10;
- break;
- case fix_dgps:
- workbuffer[position++] = 0x20;
- break;
- default:
- workbuffer[position++] = 0;
- break;
- }
-
- /* Assume position is valid */
- workbuffer[position++] = 0x07;
-
- if ((waypointp->sat>0)&&(waypointp->sat<128)) {
- workbuffer[position++] = waypointp->sat;
- } else {
- workbuffer[position++] = 0;
- }
-
- (void)gbfwrite(workbuffer,vitosmt_datasize,1,ofs);
-
- xfree(workbuffer);
-}
-
-
-static void
-vitosmt_write()
-{
- auto* workbuffer = (unsigned char*) xcalloc(vitosmt_headersize,1);
-
- count = 0;
-
- /* leave a spacer for the header */
- memset(workbuffer,0,vitosmt_headersize);
- (void)gbfwrite(workbuffer,vitosmt_headersize,1,ofs);
-
- if (doing_wpts) { /* process as waypoints */
- waypt_disp_all(vitosmt_waypt_pr);
- } else if (doing_rtes) { /* process as route */
- route_disp_all(nullptr, nullptr, vitosmt_waypt_pr);
- } else { /* default track mode */
- track_disp_all(nullptr, nullptr, vitosmt_waypt_pr);
- }
-
-
- /* write the complete the header */
- size_t position = 0;
- le_write32(&workbuffer[position],vitosmt_version);
- position += sizeof(uint32_t);
- le_write32(&workbuffer[position],vitosmt_subversion);
- position += sizeof(uint32_t);
- le_write32(&workbuffer[position],count);
- position += sizeof(uint32_t);
- le_write32(&workbuffer[position],0);
- position += sizeof(uint32_t);
- le_write32(&workbuffer[position],count-1);
- position += sizeof(uint32_t);
- le_write32(&workbuffer[position],count);
- position += sizeof(uint32_t);
-
- gbfrewind(ofs);
- (void)gbfwrite(workbuffer,vitosmt_headersize,1,ofs);
-
- xfree(workbuffer);
-}
-
-ff_vecs_t vitosmt_vecs = {
- ff_type_file,
- FF_CAP_RW_ALL,
- rd_init,
- wr_init,
- rd_deinit,
- wr_deinit,
- vitosmt_read,
- vitosmt_write,
- nullptr,
- nullptr,
- CET_CHARSET_UTF8, 1 /* do nothing | CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- Read Vito SmartMap .vtt tracks
-
- Copyright (C) 2007 Jeremy Ehrhardt, jeremye@caltech.edu
-
-based on vitostc.c, which is
-Copyright (C) 2005 Etienne TASSE
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include "defs.h"
-#include <cmath>
-
-#define MYNAME "vitovtt"
-
-#define TM_YEAR_ZERO 1900
-#define TM_MONTH_ZERO 1
-
-static gbfile* infile = nullptr;
-static int count = 0;
-
-static const int vitovtt_version = 3;
-// static const size_tvitovtt_headersize = 16;
-// static const size_tvitovtt_datasize = 32;
-
-static const double vitovtt_latitudescale = 20000000.0;
-static const double vitovtt_longitudescale = 10000000.0;
-static const int vitovtt_secondscale = 30000000;
-static const int vitovtt_microsecondscale = 30;
-
-static void
-rd_init(const QString& fname)
-{
- infile = gbfopen_le(fname, "rb", MYNAME);
-}
-
-static void
-rd_deinit()
-{
- gbfclose(infile);
-}
-
-static void
-vitovtt_read()
-{
- struct tm tmStruct;
-
- memset(&tmStruct, 0, sizeof(tmStruct));
-
- auto* rte = new route_head;
- track_add_head(rte);
-
- /* Read the header. */
- int version = gbfgetint32(infile);
- count = gbfgetint32(infile);
-
- if (version != vitovtt_version) {
- fatal("%s (%d) reading file. Unsupported version %d\n",
- MYNAME, __LINE__, version);
- }
-
- while (count) {
- /* Read an entry. */
- int scaled_lat = gbfgetint32(infile);
- int scaled_lon = gbfgetint32(infile);
- double altitude = gbfgetflt(infile);
- tmStruct.tm_year = gbfgetint16(infile) - TM_YEAR_ZERO;
- tmStruct.tm_mon = gbfgetc(infile) - TM_MONTH_ZERO;
- tmStruct.tm_mday = gbfgetc(infile);
- tmStruct.tm_hour = gbfgetc(infile);
- tmStruct.tm_min = gbfgetc(infile);
- int scaled_sec = gbfgetint32(infile);
- double speed = gbfgetflt(infile);
- int course = gbfgetint16(infile);
- int status = gbfgetint32(infile);
-
- auto* wpt_tmp = new Waypoint;
-
- wpt_tmp->latitude= scaled_lat / vitovtt_latitudescale;
- wpt_tmp->longitude= scaled_lon / vitovtt_longitudescale;
- wpt_tmp->altitude= altitude;
-
- tmStruct.tm_sec = scaled_sec / vitovtt_secondscale;
- int microseconds = (scaled_sec % vitovtt_secondscale) / vitovtt_microsecondscale;
- wpt_tmp->SetCreationTime(mkgmtime(&tmStruct), lround(microseconds/1000.0));
- /*
- * TODO: interpret speed, course, status
- */
- (void) speed;
- (void) course;
- (void) status;
-
- track_add_wpt(rte, wpt_tmp);
-
- count--;
- }
-}
-
-ff_vecs_t vitovtt_vecs = {
- ff_type_file,
- { ff_cap_none, ff_cap_read, ff_cap_none },
- rd_init,
- nullptr,
- rd_deinit,
- nullptr,
- vitovtt_read,
- nullptr,
- nullptr,
- nullptr,
- CET_CHARSET_UTF8, 1/* do nothing | CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
-
- Reader for Honda/Acura (Alpine) Navigation System VP Log (VPL) files
-
- Copyright (C) 2009 Chris Tracy, gpsbabel@adiemus.org
- Copyright (C) 2005 Robert Lipe, robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-*/
-
-/*
- With logging enabled (Diagnostic Menu | Functional Setup | Log Data), VPL
- files are written to the PC Card. The files themselves are written out as
- ASCII files, mostly containing lines of hexadecimal characters. The format
- seems similar to NMEA, with various sentences carrying different types of
- information. For our purposes, the only sentence that matters is the '75'
- sentence. For example:
-
-75700241FA59FB242CD500CF041984991E0B0A0C09060613064509060613064424824D68FF00000800051C000271
-00--1111111122222222333344445555--667788999999999999AAAAAAAAAAAA--------------------------XX
-
-0 - Sentence type
-1 - Latitude in hex (signed, divide by 0xE1000 for decimal degrees)
- 0241FA59 -> 37878361 / 0xE1000 = 41.100652
-2 - Longitude in hex (signed, divide by 0xE1000 for decimal degrees)
- FB242CD5 -> -81515307 / 0xE1000 = -88.449769
-3 - Altitude (signed, meters)
- 00CF -> 207
-4 - Speed (divide by 0x10 for MPH)
- 0419 -> 1049 / 0x10 = 65.5625
-5 - Heading (multiply by 360/65535 to constrain to 0 - 360 degrees)
- 8499 -> 33945 * (360/65535) = 186.47
-6 - Number of sats
- 0B -> 11
-7 - HDOP (divide by 8)
- 0A -> 10 / 8 = 1.25
-8 - VDOP (divide by 8)
- 0C -> 12 / 8 = 1.5
-9 - Date and Time (YYMMDDHHMMSS)
- 090606130645 = June 6, 2009 13:06:45
-A - Previous line date and time (?)
- 090606130644 = June 6, 2009 13:06:44
-X - Checksum (xor, ala NMEA)
-
-***********************************
-* Unused, but (at least partially) decoded sentences
-
-******
-0D - Yaw Gyro (This field is not currently decoded herein)
- This field is written 25 times per second. It contains the raw values
- from the yaw gyro. Positive values for right turns, negative values
- for left turns.
-
-0D00FEFA09
-00??1111CC
-
-0 - Sentence Type
-? - An unknown field with observed values between 0 and 3.
-1 - Yaw Gyro value
-C - Checksum
-
-******
-31 - Distance Traveled
- This field is written once a second. It contains the number of
- meters traveled since the navigation system was last turned on.
-
-310000117050
-0011111111CC
-
-0 - Sentence Type
-1 - Distance Traveled in Meters
-C - Checksum
-
-******
-35 - Raw Position
- This field is written 5 times per second. It contains Latitude
- and Longitude, as well as two currently unknown angular values.
-
-35CFBB5CBC1744CB1BD9023308C2
-00111111112222222233334444CC
-
-0 - Sentence Type
-1 - Longitude (divide by 0x8CA000 for decimal degrees)
-2 - Latitude (divide by 0x8CA000 for decimal degrees)
-3 - Unknown angular value (multiply by 360/65535)
-4 - Unknown angular value (multiply by 360/65535)
-C - Checksum
-
-*/
-
-/*
- TODO:
- - Implement checksum verification
- */
-
-#include "defs.h"
-#include <cstdio> /* for sscanf */
-
-#define MYNAME "vpl"
-
-static void vpl_parse_75_sentence(const char*);
-
-static
-QVector<arglist_t> vpl_args = {
-};
-
-static gbfile* vpl_file_in;
-static route_head* track_head;
-
-/*******************************************************************************
-* %%% global callbacks called by gpsbabel main process %%% *
-*******************************************************************************/
-
-static void
-vpl_rd_init(const QString& fname)
-{
- vpl_file_in = gbfopen(fname, "r", MYNAME);
-}
-
-static void
-vpl_rd_deinit()
-{
- gbfclose(vpl_file_in);
-}
-
-static void
-vpl_read()
-{
- char* ibuf;
-
- // Set up a track
- if (track_head == nullptr) {
- track_head = new route_head;
- track_add_head(track_head);
- }
-
- while ((ibuf = gbfgetstr(vpl_file_in))) {
- if (strncmp(ibuf, "75", 2) == 0) {
- vpl_parse_75_sentence(ibuf);
- }
- }
-}
-
-/*******************************************************************************
-* Local Functions
-*******************************************************************************/
-
-void
-vpl_parse_75_sentence(const char* ibuf)
-{
- uint32_t ymd, hms;
- int32_t lat_raw, lon_raw;
- int16_t alt, speed_raw;
- uint16_t hdg_raw;
- uint8_t sats, hdop_raw, vdop_raw;
- struct tm tm;
-
- // The files have DOS line endings (CR/LF) but we don't care, because we
- // don't read to the end.
- sscanf(ibuf, "75%*2c%8X%8X%4hX%4hX%4hX%*2c%2hhX%2hhX%2hhX%6u%6u",
- &lat_raw, &lon_raw, &alt, &speed_raw, &hdg_raw, &sats, &hdop_raw, &vdop_raw,
- &ymd, &hms);
-
- tm.tm_sec = hms % 100;
- hms /= 100;
- tm.tm_min = hms % 100;
- hms /= 100;
- tm.tm_hour = hms % 100;
-
- tm.tm_mday = ymd % 100;
- ymd /= 100;
- tm.tm_mon = ymd % 100;
- ymd /= 100;
- tm.tm_year = ymd % 100 + 100;
-
- auto* waypt = new Waypoint;
-
- // Lat/Lon are both stored *0xE1000 which we have to divide out
- // for decimal degrees
- waypt->latitude = lat_raw / (double) 0xE1000;
- waypt->longitude = lon_raw / (double) 0xE1000;
- waypt->altitude = alt;
- waypt->sat = sats;
- // Speed comes in (MPH x 0x10) which we have to convert to m/s
- WAYPT_SET(waypt, speed, (speed_raw / (double) 0x10) * 0.44704);
- WAYPT_SET(waypt, course, hdg_raw * (360.0f/65535.0f));
- waypt->hdop = hdop_raw / 8.0;
- waypt->vdop = vdop_raw / 8.0;
-
- waypt->SetCreationTime(mkgmtime(&tm));
-
- track_add_wpt(track_head, waypt);
-}
-
-/**************************************************************************/
-
-ff_vecs_t vpl_vecs = {
- ff_type_file,
- {
- ff_cap_none /* waypoints */,
- ff_cap_read /* tracks */,
- ff_cap_none /* routes */
- },
- vpl_rd_init,
- nullptr,
- vpl_rd_deinit,
- nullptr,
- vpl_read,
- nullptr,
- nullptr,
- &vpl_args,
- CET_CHARSET_ASCII, /* ascii is the expected character set */
- 1 /* fixed, can't be changed through command line parameter */
- , NULL_POS_OPS,
- nullptr
-};
-/**************************************************************************/
+++ /dev/null
-/*
- Copyright (C) 2006 Etienne Tasse etasse@yahoo.com
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include "defs.h"
-#include "xmlgeneric.h"
-#include <QXmlStreamAttributes>
-#include <cstdio>
-
-/* argument storage */
-static char* aicicon =nullptr;
-static char* aioicon =nullptr;
-static char* ahcicon =nullptr;
-static char* ahoicon =nullptr;
-static char* snmac =nullptr;
-
-static
-QVector<arglist_t> wfff_xml_args = {
- {
- "aicicon", &aicicon, "Infrastructure closed icon name",
- "Red Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "aioicon", &aioicon, "Infrastructure open icon name",
- "Green Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "ahcicon", &ahcicon, "Ad-hoc closed icon name",
- "Red Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "ahoicon", &ahoicon, "Ad-hoc open icon name",
- "Green Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {"snmac", &snmac, "Shortname is MAC address", nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr },
-};
-
-#define xfreez(p) { if (p) xfree(p); p=0; }
-
-#define MYNAME "wfff_xml"
-
-static xg_callback wfff_s, wfff_e;
-static xg_callback wfff_wep, wfff_mac, wfff_type;
-static xg_callback wfff_ssid, wfff_chan;
-static xg_callback wfff_mnrssi, wfff_mxrssi;
-static xg_callback wfff_first, wfff_last;
-static xg_callback wfff_hdop, wfff_lat, wfff_lon;
-
-static
-xg_tag_mapping loc_map[] = {
- { wfff_s, cb_start, "/DocumentElement/AP" },
- { wfff_e, cb_end, "/DocumentElement/AP" },
- { wfff_wep, cb_cdata, "/DocumentElement/AP/WEP" },
- { wfff_mac, cb_cdata, "/DocumentElement/AP/MAC" },
- { wfff_ssid, cb_cdata, "/DocumentElement/AP/SSID" },
- { wfff_type, cb_cdata, "/DocumentElement/AP/Type" },
- { wfff_mnrssi, cb_cdata, "/DocumentElement/AP/MinRSSI" },
- { wfff_mxrssi, cb_cdata, "/DocumentElement/AP/MaxRSSI" },
- { wfff_chan, cb_cdata, "/DocumentElement/AP/Channel" },
- { wfff_first, cb_cdata, "/DocumentElement/AP/FirstSeen" },
- { wfff_last, cb_cdata, "/DocumentElement/AP/LastSeen" },
- { wfff_hdop, cb_cdata, "/DocumentElement/AP/HDOP" },
- { wfff_lat, cb_cdata, "/DocumentElement/AP/Lat" },
- { wfff_lon, cb_cdata, "/DocumentElement/AP/Lon" },
- { nullptr,(xg_cb_type)0,nullptr }
-};
-
-/* work variables for wfff_xxx */
-static QString ap_mac;
-static QString ap_ssid;
-static QString ap_type;
-static QString ap_wep;
-static int ap_chan =0;
-static time_t ap_first =0;
-static QString ap_last;
-static float ap_mnrssi =0.0;
-static float ap_mxrssi =0.0;
-static float ap_hdop =0.0;
-static double ap_lat =0.0;
-static double ap_lon =0.0;
-
-/* Start of AP block */
-void wfff_s(xg_string, const QXmlStreamAttributes*)
-{
- ap_mnrssi=0.0;
- ap_mxrssi=0.0;
- ap_chan=0;
- ap_hdop=0.0;
- ap_first=0;
- ap_last=QString();
- ap_lat=0.0;
- ap_lon=0.0;
-}
-
-void wfff_mac(const QString& args, const QXmlStreamAttributes*) {
- ap_mac = args;
-}
-void wfff_ssid(const QString& args, const QXmlStreamAttributes*) {
- ap_ssid = args;
-}
-void wfff_type(const QString& args, const QXmlStreamAttributes*) {
- ap_type = args;
-}
-void wfff_mnrssi(const QString& args, const QXmlStreamAttributes*) {
- ap_mnrssi = args.toDouble();
-}
-void wfff_mxrssi(const QString& args, const QXmlStreamAttributes*) {
- ap_mxrssi = args.toDouble();
-}
-void wfff_chan(const QString& args, const QXmlStreamAttributes*) {
- ap_chan = args.toInt();
-}
-void wfff_first(const QString& args, const QXmlStreamAttributes*) {
- ap_first = xml_parse_time(args).toTime_t();
-}
-void wfff_last(const QString& args, const QXmlStreamAttributes*) {
- ap_last = args;
-}
-void wfff_wep(const QString& args, const QXmlStreamAttributes*) {
- ap_wep = args;
-}
-void wfff_hdop(const QString& args, const QXmlStreamAttributes*) {
- ap_hdop = args.toDouble();
-}
-void wfff_lat(const QString& args, const QXmlStreamAttributes*) {
- ap_lat = args.toDouble();
-}
-void wfff_lon(const QString& args, const QXmlStreamAttributes*) {
- ap_lon = args.toDouble();
-}
-
-/* End of AP Block, set waypoint and add */
-static long tosscount=0;
-
-void wfff_e(xg_string, const QXmlStreamAttributes*)
-{
- char desc[255] ="\0";
-
- if ((ap_hdop>=1)&&(ap_hdop<50)) { // Discard invalid GPS fix
- auto* wpt_tmp = new Waypoint;
-
- if (snmac) {
- wpt_tmp->shortname = ap_mac;
- } else {
- wpt_tmp->shortname = ap_ssid;
- }
-
- snprintf(desc, sizeof desc,
- "%s/%s/WEP %s/Ch %d/%2.0fdB/%2.0fdB/%s",
- snmac?CSTR(ap_ssid):CSTR(ap_mac), CSTR(ap_type), CSTR(ap_wep),
- ap_chan, ap_mnrssi, ap_mxrssi, CSTR(ap_last));
- wpt_tmp->description = desc;
-
- wpt_tmp->latitude = ap_lat;
- wpt_tmp->longitude = ap_lon;
- wpt_tmp->hdop = ap_hdop;
- wpt_tmp->altitude = unknown_alt;
- wpt_tmp->fix = fix_unknown;
-
- QString ap_wep_(ap_wep);
- QString ap_type_(ap_type);
- if (ap_wep_.startsWith("on", Qt::CaseInsensitive)) {
- if (ap_type_.startsWith("AP", Qt::CaseInsensitive)) {
- wpt_tmp->icon_descr = aicicon; /* Infra Closed */
- } else {
- wpt_tmp->icon_descr = ahcicon; /* AdHoc Closed */
- }
- } else {
- if (ap_type_.startsWith("AP", Qt::CaseInsensitive)) {
- wpt_tmp->icon_descr = aioicon; /* Infra Open */
- } else {
- wpt_tmp->icon_descr = ahoicon; /* AdHoc Open */
- }
- }
-
- wpt_tmp->SetCreationTime(ap_first);
-
- waypt_add(wpt_tmp);
-
- } else {
- tosscount++;
- }
-}
-
-static void
-wfff_xml_rd_init(const QString& fname)
-{
- tosscount = 0;
-
- xml_init(fname, loc_map, nullptr);
-}
-
-void
-static wfff_xml_read()
-{
- xml_read();
-}
-
-void
-static wfff_xml_rd_deinit()
-{
- xml_deinit();
-
- if (tosscount) {
- warning("Warning: %s reading file. Threw away %ld invalid entries.\n",
- MYNAME, tosscount);
- }
-
-}
-
-ff_vecs_t wfff_xml_vecs = {
- ff_type_file,
- {ff_cap_read, ff_cap_none, ff_cap_none},
- wfff_xml_rd_init,
- nullptr,
- wfff_xml_rd_deinit,
- nullptr,
- wfff_xml_read,
- nullptr,
- nullptr,
- &wfff_xml_args,
- CET_CHARSET_UTF8, 0,
- NULL_POS_OPS,
- nullptr
-};
These values are also used internally by the
<link linkend="fmt_gdb">GDB</link>
- ,
-
- <link linkend="fmt_bcr">BCR</link>
, and
- <link linkend="fmt_pcx">PCX</link>
+ <link linkend="fmt_bcr">BCR</link>
formats.</para>
<simplelist columns="5">
like to be able to share them. Unfortunately, his copy of
<link linkend="fmt_gdb">Garmin Mapsource</link>
won't read data created by your copy of
- <link linkend="fmt_mapsend">Magellan Mapsend DirectRoute</link>
+ <link linkend="fmt_tpg">National Geographic Topo</link>
. What you need
is a program that converts data between the two programs.</para>
<para>GPSBabel actually solves that problem for you and much more...
<link linkend="Styles">style</link>
mechanism.</para>
</section>
-</preface>
\ No newline at end of file
+</preface>
+++ /dev/null
-<para>
-CompeGPS data files are those read and written by the
-<productname>CompeGPS</productname> TwoNav software (running on a Mac, a PC,
-or on select cell phones) as well as CompeGPS Land, and CompeGPS Air.
-These files are also used by the CompeGPS TwoNav Aventura and TwoNav Sportiva GPS receivers when they are in mass storage mode.
-</para>
-
-<para>
-Release 6.1 of CompeGPS Land and CompeGPS Air added GPX as an import export format for waypoints, routes, and tracks. As GPX is a more heavily used format, you should probably use that for new applications.
-</para>
-
-<para>
-For more information please see
-<ulink url="http://www.compegps.com">http://www.compegps.com</ulink>
-</para>
-
+++ /dev/null
-<para>
- Like GPSBabel, <ulink url="http://www.gpsinformation.org/ronh/g7towin.htm">G7ToWin</ulink> is a program which allows uploading and
- downloading information from several GPS devices (Garmin, Lowrance/Eagle, Magellan).
- G7ToWin has its own data format, which is an enhanced format used in Gardown.
-</para>
-
-<para>
- This format can read both file types, G7ToWin (.g7t) and Gardown (.gdn).
-</para>
+++ /dev/null
-<para>
- The gopal format is a track format written by the
- <ulink url="http://www.mediongopal.de/">GoPal Navigation</ulink> program.
-</para>
-
-<para>
- The format of the file itself is quite simple:</para>
- <para>
- <programlisting>
- Fileformat GoPal
- TICK; TIME UTC; LONG; LAT; HEIGHT; SPEED km/h; FIX; HDOP; SAT
- 3801444, 080558, 2.944362, 43.262117, 295.28, 0.12964, 2, 2.900000, 3
- </programlisting>
-
-Filenames are automatically created by the device as follows:
- <programlisting>
- trackYYYYMMDD_HHMMSS.trk </programlisting>
- and/or, depending on software version and settings:
- <programlisting>
- A_YYYYMMDD_HHMMSS.trk
- </programlisting>
- with HHMMSS local time (not UTC!)
- </para>
- <para>
-The file format lacks the correct date value for each trackpoint, so it has to be computed starting from the
-date given in the filename. To handle files without a parsable date in the
-name, the command line option 'date' is provided.
-</para>
-<para>
-Conversions from gopal into any other format are a bit lossy concerning the first field of each line which looks like an useless time tick value
-and is simply discarded while reading. If written, there will be a time_t value from the current (computed) timestamp.
-</para>
-<para>
-Somewhere around Gopal 4.8 or 5.0, Electrobit added three more fields to the end of this format. They are, in order, date (which eliminates most of the silliness above), an unknown field, and a bearing. GPSBabel now reads the date and ignores the other two. We don't yet write these three fields for compatibility with earlier versions.
-</para>
-<para>
-
-Filtering out invalid data points is handled by the options 'clean', 'minspeed' and 'maxspeed'.
-For each datapoint the speed needed to come the from the last valid point is
-calculated and compared with the limits.
-Thus one cat easily discard unreliable points.
-
- </para>
+++ /dev/null
-
-
-
- <para> <ulink url="http://www.ncc.up.pt/gpsman/">GPS Manager</ulink>
-can read and write formats GPSBabel doesn't understand. The format defaults
-(WGS84, DDD) work reliably. Tracks, routes, and non-default format options
-are not supported.
- </para>
-
- <para>This format is documented at the GPS Manager
- <ulink url="http://www.ncc.up.pt/gpsman/gpsmanhtml/manual/html/GPSMandoc_30.html">doc site</ulink>.
- </para>
-
+++ /dev/null
-
-
-
- <para>The format we call <ulink url="http://www.cs.uakron.edu/~hennings/gpsutil">gpsutil</ulink> is a simple file format used by a program that runs
-on POSIX- compliant OSes like UNIX and Linux. Reads and writes of
-this format are very reliable. (<ulink url="/people/robertlipe.html">The lead
-developer of GPSBabel</ulink> also contributed to this that 'gpsutil'
-the early days.)</para>
-<para>
- Note that 'gpsutil' is a different format - and program - than the one called <ulink url="http://www.gpsu.co.uk/index.html">GPS Utility</ulink>; for that one, you should probably use our <link linkend="fmt_pcx">PCX module</link>.
-</para>
-
+++ /dev/null
-<para>
- This read-only format reads the XML marker files from <ulink url="http://jogmap.de"> Jogmap</ulink> as tracks. Each "markers" entry is a new track with each "marker" entry being a trackpoint.
-</para>
+++ /dev/null
-<para>
- From the <ulink url="http://www.geotagger.co.uk/files/JTR_Format.pdf">file format description</ulink>:
-</para>
-<para>
- The JTR file format is used by the Jelbert GeoTagger device to record
- location information relating to where photographs have been taken.
- One record entry is created for each press of the shutter on the
- camera.
-</para>
-<para>
- The JTR file format will be updated in the future so it is important to
- check for the current version ID within the file that is present at the
- beginning of each line of data. It is currently “GEOTAG2”
-</para>
-<para>
- Each line of the JTR file currently starts with the word “GEOTAG2”
- followed by a comma and then two NMEA sentences separated by a
- comma character with a CR at the end. The $GPRMC (date, time and
- position) data is followed by the $HCHDG (magnetic compass) data.
-</para>
-<para>
- Although the $GPRMC data segment contains a compass bearing, this
- should be ignored unless the $HCHDG compass direction is null which
- can happen if the electronic compass is switched off. Use the magnetic
- compass bearing in preference to the GPS derived compass.
- The two NMEA checksums can be ignored for the time being.
-</para>
-
+++ /dev/null
-<para>
- This format supports the on-card format used by the
- <ulink url="http://www.magellangps.com">Magellan</ulink> Explorist 400,
- Explorist 500, Explorist 600, Explorist 210, and Explorist XL
- to describe geocaches. Notice what while the format can
- hold an infinite number of geocaches, the unit will read and silently
- discard all but 200 geocache POIs at a time.</para>
-<para>
- You should name any file created with this format with a ".gs" extension
- so the firmware can read it.
-</para>
-<para>
- This format does support reading .gs files, but it's kind of a
- pointless operation as the units can't create or edit these files.
- Round-tripped data is lossy for all but the most trivial cases as
- many fields are shortened or discarded on write. "Date last found" is
- discarded on read as there are no logs stored on the device in which to
- store the date last found.
-</para>
+++ /dev/null
-<para>
- This format supports the
- <ulink url="http://www.magellangps.com">Magellan</ulink>
- <productname>MapSend</productname> native file format.
-</para>
-<para>
- Kudos to Magellan for having the foresight to document their file formats,
- making software like this possible.
-</para>
+++ /dev/null
-
-
-
- <para>Support for Navigon Mobile Navigator route (.rte) files.
-This is a very simple text format that only requires coordinates, but
-has fields for many other things. We only write coordinates as fields
-like 'city' and 'street' cannot typically be populated from other
-formats. <ulink url="http://www.navigon.com">www.navigon.com</ulink>
- </para>
-
+++ /dev/null
-<para>
-This option specifies the default icon name on output.
-</para>
+++ /dev/null
-<para>
-Because this format supports only one route or track, this option may be used
-on output to select a single route or track from a collection of routes and
-tracks read from a more expressive format. If you have, say, a
-<link linkend="fmt_gpx">gpx</link> file that contains two routes, you may
-use this option to write them one at a time to individual files.
-</para>
-<para><userinput>gpsbabel -i gpx -f routes.gpx -o compegps,index=1 -F route1.txt -o compegps,index=2 -F route2.txt</userinput></para>
+++ /dev/null
-<para>
-This option specifies the default proximity for waypoints and route points.
-</para>
+++ /dev/null
-<para>
-This option specifies the default length for short names generated on output.
-The default length is 16.
-</para>
</para>
<para>
Proximity distance is also supported by <link linkend="fmt_gpx">GPX</link>, <link linkend="fmt_gdb">Garmin GDB</link>, <link linkend="fmt_ozi">OZI Explorer</link>,
- <link linkend="fmt_compegps">CompeGPS</link> and <link linkend="fmt_unicsv">Universal CSV</link>.
+ and <link linkend="fmt_unicsv">Universal CSV</link>.
</para>
<para>
<userinput>
+++ /dev/null
-<para>
- Specifying the <option>clean</option> flag makes the Gopal reader pass
- over the data and discard data that is probably incorrect such as the
- longitude and latitude of "0".
-</para>
-<para>
- If you happen to be a boater or pilot off the south short of Ghana,
- you may disagree that coordinates of "0, 0" are bad.
-</para>
-
+++ /dev/null
-<para>
- This option is useful if you have tracks from Gopal that have been renamed.
-</para>
+++ /dev/null
-<para>
- This is useful for removing wildly erroneous data from your recorded track.
-</para>
+++ /dev/null
-<para>
- If this is greater than zero, duplicate waypoints will be removed.
-</para>
+++ /dev/null
-<para>
-This option sets the MapSend version to generate TRK files,
-since new MapSend versions can't open version 3 files.
-Valid values are 3 (MapSend v3.0) or 4 (MapSend v4.0 and v4.1).
-</para>
-
+++ /dev/null
-<para>
-Because the format supports only one route, this option may be used
-on output to select a single route from a collection of
-routes read from a more expressive format. If you have, say, a
-<link linkend="fmt_gpx">gpx</link> file that contains two routes, you may
-use this option to write them one at a time to individual files.
-</para>
-<para><userinput>gpsbabel -i gpx -f routes.gpx -o nmn4,index=1 -F route1.rte -o nmn4,index=2 -F route2.rte</userinput></para>
-
+++ /dev/null
-<para>
- Carto Exploreur requires a slightly incompatible variation of the PCX format
-when written. Specifying this option on write tells us to create that strain of PCX.
-</para>
+++ /dev/null
-<para>
- The deficon option is used to control the icon output when writing to this format. It overrides any icon information that might be present in the source data.
-</para>
+++ /dev/null
-<para>
- Convert route number 'index' from source into sdf format.
-</para>
-<para>
- We have a lot of more expressive formats that support more than one route.
- At this place sdf files are limited to only one single route. With option index
- you can specify which route from source should be converted.
-</para>
-<para>
- Our default index is 1.
-</para>
-<para>
- This example will convert route number two and three into separate sdf files:
-</para>
- <para><userinput> gpsbabel -i gdb -f routes.gdb -r -o stmsdf,index=2 -F route-one.sdf -r -o stmsdf,index=3 -F route-three.sdf </userinput></para>
+++ /dev/null
-<para>
-Because the format supports only one route or track, this option may be used
-on output to select a single route or track from a collection of routes and
-tracks read from a more expressive format. If you have, say, a
-<link linkend="fmt_gpx">gpx</link> file that contains three routes, you may
-use this option to write them one at a time to individual files.
-</para>
-<para><userinput>gpsbabel -i gpx -f routes.gpx -o stmwpp,index=1 -F route1.txt -o stmwpp,index=2 -F route2.txt -o stmwpp,index=3 -F route3.txt</userinput></para>
-
+++ /dev/null
-<para>
-genurl is a convenience option for generating the scaling parameters
-when accessing the Tiger servers. It will output the latitude, longitude,
-height, and width parameters in a form suitable for use in the URL to generate
-a map that will hold all the points to be displayed and is suitably scaled
-and centered.
-</para>
-<para>For example:</para>
-<para><userinput>gpsbabel -i geo -f geocaching.loc -o tiger,genurl=tiger.ctr -F tiger.dat</userinput></para>
-<para>
-may create tiger.ctr with
-<screen format="linespecific">
-lat=36.042108&lon=-86.877408&ht=0.161172&wid=0.591771&iwd=768&iht=768</screen>
-
-After uploading tiger.dat to a public server, a request to
-<screen format="linespecific"> http://tiger.census.gov/cgi-bin/mapgen?murl=$THATFILE$(cat tiger.ctr)</screen>
-will return a gif file from the tiger server that's suitably scaled.
-
-</para>
-
+++ /dev/null
-<para> This options signifies that the icon in the incoming format is to be used
-without change in the generated Tiger output file. Without this option,
-GPSBabel tries to color pins based on their creation time and certain
-Geocaching traits when available.</para>
+++ /dev/null
-<para>This option specifies a margin around the maps for the genurl options.
-The margin may be specified in either decimal degrees or as a
-percentage.</para>
-<para>
-This option is most useful for ensuring there is adequate space for
-the label around the markers when generating automatically scaled maps.
-</para>
+++ /dev/null
-<para>This option specifies the pin to be used if a waypoint has a creation
-time older than 'oldthresh' days.</para>
-<para>The default is "greenpin".</para>
+++ /dev/null
-<para>This option tells GPSBabel to not generate labels on the pins. If
-this is true, the description of the incoming waypoints are ignored and not
-placed on the pins.</para>
+++ /dev/null
-<para>This option specifies the pin to be used if a waypoint has a creation
-time newer than 'oldthresh' days.</para>
-<para>The default is "redpin".</para>
+++ /dev/null
-<para>This options allows you to control the threshold in days between
-whether a pin is considered "new" (and thus potentially governed by the
-'newmarker' option) or "old" (and thus potentially governed by the
-'oldmarker' option).
-</para>
+++ /dev/null
-<para>
-The snlen option controls the maximum length of names generated by the '-s'
-option. It's particularly useful in Tiger maps to avoid the amount of clutter
-generated by potentially lengthy labels on the markers.
-</para>
+++ /dev/null
-<para>
-When set, this options tells the '-s' smartname generator to not allow
-any spaces in the labels generated for markers.
-</para>
+++ /dev/null
-<para>
- Specifies the icon type for unfound geocaches. Default is "bluepin".
-</para>
+++ /dev/null
-<para>The xpixels argument lets you specify the number of pixels to be
-generated by the Tiger server along the horizontal axis when using the
-'genurl' option. </para>
+++ /dev/null
-<para>The ypixels argument lets you specify the number of pixels to be
-generated by the Tiger server along the vertical axis when using the
-'genurl' option. </para>
-
+++ /dev/null
-<para>
-This options lets you specify an icon for an Ad-hoc, closed, waypoint.
-</para>
+++ /dev/null
-
-<para>
-This options lets you specify an icon for an Ad-hoc, open, waypoint.
-</para>
+++ /dev/null
-<para>
-This option lets you specify an icon for infrastructure closed points.
-</para>
+++ /dev/null
-
-<para>
-This option lets you specify an icon for infrastructure open points.
-</para>
+++ /dev/null
-<para>
- This options lets you specify that the shortname of the waypoint is the MAC address.
-</para>
+++ /dev/null
-<para>
-This option specifies the string GPSBabel should use to separate the parts
-of the street address. Since most other formats supported by GPSBabel do
-not support street addresses, the street address fields from the Yahoo file
-are concatenated into the waypoint "notes" field.
-</para>
-<para>
-The default value for this option is a comma followed by a space (", ").
-</para>
+++ /dev/null
- <para> Garmin documents only PCX5, an older format limited to
-the lame NMEA six-character waypoint names that's treated as a
-second-class citizen in current versions of MapSource. In Mapsource,
-use file->import to read these files. If you name the files *.wpt,
-Mapsource will find them more easily.
-</para>
- <para> In general, you should prefer the "mapsource" file format
-to this one.
-</para>
- <para>This format has been extended to handle many - but not all -
- files from <ulink url="http://www.gpsu.co.uk/index.html">GPS Utility</ulink>. If you encounter something that GPSBabel does not handle well, use
-the free version of GPSUtil to read it and save as something more common.
- </para>
+++ /dev/null
-<para>
- This format provides support for binary breadcrumb files from <ulink url="http://www.pocketfms.com">PocketFMS</ulink>. The default filename is GPS followed by the timestamp with no file extension.
-</para>
-<para>
- PocketFMS breadcrumbs files contain track information. That is latitude, longitude, altitude, speed, course, variation, separation, GPS error, fix type and timestamp. With exception of separation all info get processed by GPSBabel in both in and out direction.
-</para>
+++ /dev/null
-<para>
- This format provides support for XML flightplans from <ulink url="http://www.pocketfms.com">PocketFMS</ulink>.
-</para>
-<para>
- PocketFMS XML flightplans contain route and waypoint information and much more flight planning info as airspaces, aircraft performance, fuel management etc. This format cannot be read by PocketFMS. Hence GPSBabel supports only input of route and waypoint information.
-</para>
-<para>
- The PocketFMS flightplan converter take into account the -w waypoint flag. If set then additional waypoints are stored to the route point and path information.
-</para>
+++ /dev/null
-<para>\r
- This format provides support for the <ulink url="http://www.pocketfms.com">PocketFMS</ulink> user waypoints text file. \r
-</para>\r
-<para>\r
- PocketFMS waypoint text files contain one waypoint per line. Any waypoint has name, latitude and longitude, separated by space. Latitude and longitude are either decimal degrees or degrees°minutes'seconds'' triples. For details see the PocketFMS help file. You can find more information at the <ulink url="http://www.pocketfms.com/phpBB3/">PocketFMS forum</ulink>. \r
-</para>\r
+++ /dev/null
-<para>
- This format provides support for ascii files from Skyforce PC interface for
- Skymap IIIC, Skymap II (Version 4) and KMD 150. Our module was developed
- from their interface description.
-</para>
-<para>
- Each kind of our basic GPS data (waypoints, routes, and tracks) is
- stored in a separate file. Therefore you need three steps to
- convert a complex format like GPX or GDB into skyforce.
- <userinput>
- gpsbabel -i gpx -f file.gpx -o skyforce -w -F waypoints.txt -r -F routes.txt -t -F tracks.txt
- </userinput>
-</para>
+++ /dev/null
-<para>
- This format supports the .sdf files from the Suunto product family
- 'Suunto Trek Manager', 'Suunto Ski Manager' and 'Suunto Sail Manager'.
- The contents of the sdf file depends on the used product and can
- be one route or one track. That's why when you want to use sdf on the
- output side you have to use the
- <link linkend="Route_And_Track_Modes">-r OR the -t</link> option. This will tell
- GPSBabel which type of data should be written.
-</para>
-<para>
- Currently we can read the following file types:
- <simplelist columns="1">
- <member>4 = M9 TrackLog</member>
- <member>5 = Route</member>
- <member>28 = X9 TrackLog</member>
- </simplelist>
-</para>
- <para><userinput>gpsbabel -i gpx -f some-routes.gpx -r -o stmsdf,index=3 -F single-route.sdf</userinput></para>
-<para>
- <ulink url="http://www.suunto.fi">Suunto Website</ulink>
-</para>
+++ /dev/null
-<para>
-This format supports the Suunto Trek Manager (STM) WaypointPlus format.
-This is a simple format with coordinates and a time stamp. Route points
-also have a short name. A single file may only contain one route or one
-track.
-</para>
-<para>
-<ulink url="http://www.suunto.fi">Suunto Website</ulink>
-</para>
-
+++ /dev/null
-
-
-
- <para>The U.S. Census Bureau provides online mapping facilities.
-This format is described at: <ulink url="http://tiger.census.gov/instruct.html">tiger.census.gov</ulink>.
-Do notice that this format is not the actual Tiger line mapping
-records, but rather the interface to their online mapping
-program.</para>
-
+++ /dev/null
-<para>
- This format supports the <ulink url="http://www.vidaone.com">VidaOne</ulink> GPS for pocket PC GPB file type.
-</para>
-<para>
- This is have a very simple binary format which stores only the coordinates
- in the tracklog (.gpb) files.
-</para>
+++ /dev/null
-
-
-
- <para>Vito Navigator II is a Pocket PC GPS application. This
-format reads a Vito Navigator II .SMT track file and can work in
-either waypoint or track mode. The speed, heading and Dilution of
-Position data is written in the notes field.</para>
- <para> Support for writing .SMT tracks is very experimental and
-may crash VitoNavigator II on the Pocket PC.</para>
-
+++ /dev/null
-<para>
- This format reads the binary (.vtt) track logs recorded by
- <ulink url="http://vitotechnology.com/en/products/smartmap_nokia_series60.html">
- <application>VITO SmartMap for Nokia Series 60</application>
- </ulink> 1.0, a GPS application for smartphones connected to
- NMEA 0183-compatible Bluetooth GPS receivers. It may work
- with .vtt files produced by versions of VITO SmartMap
- for other platforms.
-</para>
-
-<para>
- This format was reverse engineered from a .vtt file.
- Currently, the coordinates, altitude, and time are
- available for each point recorded in a track.
- The course speed and heading fields have been identified,
- but the units are not certain and so those fields are ignored.
- The rest of the entry has not yet been decoded. The format
- uses little-endian byte ordering. The application displays
- metric units by default. Time is UTC.
-</para>
-
-<table id="vito_header">
- <title>Vito SmartMap track file header (8 bytes)</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Position</entry>
- <entry>Field info</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>bytes 0-3</entry>
- <entry>Probably a version field. Int value is 3 in sample file.</entry>
- </row>
- <row>
- <entry>bytes 4-7</entry>
- <entry>Number of points in file as int.</entry>
- </row>
- </tbody>
- </tgroup>
-</table>
-
-<table id="vito_point">
- <title>Vito SmartMap track point (32 bytes)</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Position</entry>
- <entry>Field info</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>bytes 0-3</entry>
- <entry>Decimal latitude multiplied by 20000000 as int.</entry>
- </row>
- <row>
- <entry>bytes 4-7</entry>
- <entry>Decimal longitude multiplied by 10000000 as int.</entry>
- </row>
- <row>
- <entry>bytes 8-11</entry>
- <entry>Altitude in meters as float.</entry>
- </row>
- <row>
- <entry>bytes 12-13</entry>
- <entry>Year, with century, as int.</entry>
- </row>
- <row>
- <entry>byte 14</entry>
- <entry>Month, ranging 1-12.</entry>
- </row>
- <row>
- <entry>byte 15</entry>
- <entry>Day of month, ranging 1-31.</entry>
- </row>
- <row>
- <entry>byte 16</entry>
- <entry>Hour, ranging 0-23.</entry>
- </row>
- <row>
- <entry>byte 17</entry>
- <entry>Minute, ranging 0-59.</entry>
- </row>
- <row>
- <entry>bytes 18-21</entry>
- <entry>Decimal second multiplied by 30000000 as int.</entry>
- </row>
- <row>
- <entry>bytes 22-25</entry>
- <entry>
- Probably speed in meters per second as float.
- Ranges 0-~3 in file, seems reasonable since sample
- file was acquired on foot.
- </entry>
- </row>
- <row>
- <entry>bytes 26-27</entry>
- <entry>
- Probably decimal heading multiplied by something.
- Ranges between min and max values possible when
- decoded as integer. Doesn't change when speed field is 0.
- Doesn't change smoothly, jumps around a bit.
- </entry>
- </row>
- <row>
- <entry>bytes 28-31</entry>
- <entry>
- Status field of some kind. Changes only twice in file.
- May contain satellite count or PDOP info, as both are
- reported by the application's GUI.
- </entry>
- </row>
- </tbody>
- </tgroup>
-</table>
+++ /dev/null
-<para>
- This is the log format output by factory-installed Honda/Acura (Alpine) Navigation Systems
- in (at least) 2006 models and newer. (Though I've seen indirect data that says that Acura
- nav systems at least as far back as 2004 use it too)
-</para>
-<para>
- This format is definitely known to work with the following model cars specifically:
-</para>
-<simplelist columns="1">
-<member>
- 2006 Honda Civic Hybrid
-</member>
-</simplelist>
-<para>
- Logging may be enabled by simultaneously holding down the MAP/GUIDE, MENU, and CANCEL
- buttons for 3-5 seconds, then selecting "Functional Setup", "Log Data". A PCMCIA card
- must be inserted into the system (behind the Nav LCD) for logging to work. (The system
- can read MP3/WMA files on this card and will also write logs to it. Generally, a
- PCMCIA to CF or PCMCIA to SD adapter is used with a corresponding CF/SD card) With
- logging successfully set up, the system will create a directory named "VPlog" off the
- root of the card. Inside this directory, files will be created with names corresponding
- to the date and time of engine start, in GMT. (YYMMDD_HHMM.vpl)
-</para>
-<para>
- The VPL format contains quite a bit of data, much of which remains undecoded. This format
- currently reads only lat/lon, altitude, speed, heading, date/time, visible sats, HDOP and
- VDOP.
-</para>
-<para>
- Generally, the layout of the format seems similar to NMEA, with discrete sentences
- containing different fields of data, followed by a 1-byte XOR'd checksum. Some sentences
- are generated only once per engine start, others every few seconds, many every second,
- and a few on the order of five and in one case, up to twenty five times per second. All data in
- the file is written in ASCII; most of it simply as hexadecimal characters. Most
- fields are fixed width, though a few can be variable. (Those that are variable
- have a field count as the first field after their sentence identifier) Currently,
- only the '75'-sentence is processed (and only about 70% of it), though this provides all
- the data necessary for position information.
-
- Some fields in other sentences have been decoded, but they are not currently processed.
- Information on the data in these fields can be found in vpl.c.
-</para>
+++ /dev/null
-
-
-
- <para> WFFF is the export format for <ulink url="http://www.aspecto-software.com/rw/applications/wififofum/index.html">Aspecto Software's WiFiFoFum</ulink> 2.0 for Windows Mobile PCs.</para>
- <para>It is a simple XML format that is read-only to GPSBabel and stores information about a WiFi stumbling session.</para>
- <para>All WiFi-specific elements are written in the description field, similar to the netstumbler format.</para>
-
+++ /dev/null
-<para>
-This format reads output from the
-<ulink url="http://developer.yahoo.com/maps/rest/V1/geocode.html">Yahoo geocoding API</ulink>.
-This feature of GPSBabel makes it easy to get geocoded results from
-Yahoo into your favorite mapping program, GPS receiver, or other format.
-</para>
-
+++ /dev/null
-/*
- Read Yahoo Geocoded files.
-
- Copyright (C) 2005 Robert Lipe, robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-
-#include <QXmlStreamAttributes> // for QXmlStreamAttributes
-
-#include "defs.h"
-#include "yahoo.h"
-#include "xmlgeneric.h" // for xg_string, build_xg_tag_map, xml_deinit, xml_init, xml_read
-
-
-#define MYNAME "yahoo"
-
-void
-YahooFormat::rd_init(const QString& fname)
-{
- xml_init(fname, build_xg_tag_map(this, gl_map), nullptr, nullptr, nullptr, true);
-}
-
-void
-YahooFormat::read()
-{
- xml_read();
-}
-
-void
-YahooFormat::rd_deinit()
-{
- xml_deinit();
-}
-
-void
-YahooFormat::wpt_s(xg_string, const QXmlStreamAttributes*)
-{
- wpt_tmp = new Waypoint;
-}
-
-void
-YahooFormat::wpt_e(xg_string, const QXmlStreamAttributes*)
-{
- waypt_add(wpt_tmp);
- wpt_tmp = nullptr;
-}
-
-void
-YahooFormat::wpt_lat(xg_string args, const QXmlStreamAttributes*)
-{
- wpt_tmp->latitude = args.toDouble();
-}
-
-void
-YahooFormat::wpt_lon(xg_string args, const QXmlStreamAttributes*)
-{
- wpt_tmp->longitude = args.toDouble();
-}
-
-void
-YahooFormat::wpt_addr(xg_string args, const QXmlStreamAttributes*)
-{
- if (!wpt_tmp->notes.isEmpty()) {
- wpt_tmp->notes += as;
- }
- wpt_tmp->notes += args;
-}
+++ /dev/null
-/*
- Read Yahoo Geocoded files.
-
- Copyright (C) 2002-2020 Robert Lipe, gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-#ifndef YAHOO_H_INCLUDED_
-#define YAHOO_H_INCLUDED_
-
-#include <QList> // for QList
-#include <QString> // for QString
-#include <QVector> // for QVector
-#include <QXmlStreamAttributes> // for QXmlStreamAttributes
-
-#include "defs.h"
-#include "format.h" // for Format
-#include "xmlgeneric.h" // for xg_tag_map_entry, cb_cdata, XgFunctor, cb_end, cb_start
-
-class YahooFormat : public Format
-{
-public:
- QVector<arglist_t>* get_args() override
- {
- return &yahoo_args;
- }
-
- ff_type get_type() const override
- {
- return ff_type_file;
- }
-
- QVector<ff_cap> get_cap() const override
- {
- return {
- ff_cap_read, // waypoints
- ff_cap_none, // tracks
- ff_cap_none // routes
- };
- }
-
- QString get_encode() const override
- {
- return CET_CHARSET_ASCII;
- }
-
- int get_fixed_encode() const override
- {
- return 0;
- }
-
- void rd_init(const QString&) override;
- void read() override;
- void rd_deinit() override;
-
-private:
- Waypoint* wpt_tmp{};
- char* as{};
-
- QVector<arglist_t> yahoo_args = {
- {
- "addrsep", &as,
- "String to separate concatenated address fields (default=\", \")",
- ", ", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- };
-
- void wpt_s(const QString&, const QXmlStreamAttributes*);
- void wpt_e(const QString&, const QXmlStreamAttributes*);
- void wpt_lat(const QString&, const QXmlStreamAttributes*);
- void wpt_lon(const QString&, const QXmlStreamAttributes*);
- void wpt_addr(const QString&, const QXmlStreamAttributes*);
-
- QList<xg_functor_map_entry<YahooFormat>> gl_map = {
- {&YahooFormat::wpt_s, cb_start, "/ResultSet/Result"},
- {&YahooFormat::wpt_lat, cb_cdata, "/ResultSet/Result/Latitude"},
- {&YahooFormat::wpt_lon, cb_cdata, "/ResultSet/Result/Longitude"},
- {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/Address"},
- {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/City"},
- {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/State"},
- {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/Zip"},
- {&YahooFormat::wpt_addr, cb_cdata, "/ResultSet/Result/Country"},
- {&YahooFormat::wpt_e, cb_end, "/ResultSet/Result"}
- };
-};
-
-#endif // YAHOO_H_INCLUDED_